diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/AUTHORS ns-3.35/AUTHORS
--- ns-3.34/AUTHORS	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/AUTHORS	2021-10-01 13:26:47.000000000 -0700
@@ -33,6 +33,7 @@
 Biljana Bojovic (bbojovic@cttc.es)
 Elena Borovkova (borokovaes@iitp.ru)
 Rahul Bothra (rrbothra@gmail.com)
+Caleb Bowers (caleb.bowers@nel.navy.mil, cbowers1020@gmail.com)
 Pavel Boyko (boyko@iitp.ru)
 Matthew Bradbury (matt-bradbury@live.co.uk)
 Dan Broyles (muxman@sbcglobal.net)
@@ -77,6 +78,7 @@
 Jahanzeb Farooq (Jahanzeb.Farooq@inria.fr, Jahanzeb.Farooq@gmail.com)
 Luca Favatella (slackydeb@gmail.com)
 Kim Ferrari (ferrari2@llnl.gov)
+Gabriel Ferreira (gabrielcarvfer@gmail.com)
 Margherita Filippetti (morag87@gmail.com)
 Pedro Fortuna (pedro.fortuna@inescporto.pt)
 Juliana Freitag Borin (juliana.freitag@gmail.com)
@@ -110,6 +112,7 @@
 Kristian A. Hiorth (kristahi@ifi.uio.no)
 Hrishikesh Hiraskar (hrishihirakar@gmail.com)
 Kim Højgaard-Hansen (kimrhh@gmail.com)
+Philip Hönnecke (p.hoennecke@tu-braunschweig.de)
 Chris Hood (chood8@gatech.edu)
 Blake Hurd (naimorai@gmail.com)
 Pasquale Imputato (p.imputato@gmail.com)
@@ -146,6 +149,7 @@
 Alexander Krotov (ilabdsf@yandex.ru)
 Deepak Kumaraswamy (deepakkavoor99@gmail.com)
 Mathieu Lacage (mathieu.lacage@inria.fr)
+Sandra Lagen (sandra.lagen@cttc.es)
 Emmanuelle Laprise (emmmanuelle.laprise@bluekazoo.ca)
 Harsh Lara (harshapplefan@gmail.com)
 Mattia Lecci (mattia.lecci@gmail.com)
@@ -218,6 +222,7 @@
 Michele Polese (michele.polese@gmail.com)
 Ovidiu Poncea (ovidiu.poncea@cs.pub.ro)
 Anna Poon (poon2@llnl.gov)
+Gauri Prasad
 Vikas Pushkar (vikaskupushkar@gmail.com)
 Alberto Gallegos Ramonet (ramonet@fc.ritsumei.ac.jp)
 Manoj Kumar Rana (manoj24.rana@gmail.com)
@@ -249,6 +254,7 @@
 Chappidi Yoga Satwik (satwik.chappidi@iitkgp.ac.in)
 Robert R. Schmidt (rschmi@gmx.net)
 Florian Schmidt (Florian.Schmidt@cs.rwth-aachen.de)
+Michael Scoggin (mpscogg@sandia.gov)
 Surya Seetharaman (suryaseetharaman.9@gmail.com)
 Guillaume Seguin (guillaume.seguin@inria.fr)
 Ioannis Selinis (selinis.g@gmail.com)
@@ -271,6 +277,7 @@
 YunQiang Su (wzssyqa@gmail.com)
 Brian Swenson (bswenson3@gatech.edu)
 Lalith Suresh  (suresh.lalith@gmail.com)
+Szymon Szott (szott@kt.agh.edu.pl)
 Mohit P. Tahiliani (tahiliani.nitk@gmail.com)
 Rohit P. Tahiliani (tahiliar@tcd.ie)
 Dave Taht (dave.taht@bufferbloat.net)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/bindings/python/ns3modulegen.py ns-3.35/bindings/python/ns3modulegen.py
--- ns-3.34/bindings/python/ns3modulegen.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/bindings/python/ns3modulegen.py	1969-12-31 16:00:00.000000000 -0800
@@ -1,177 +0,0 @@
-
-LOCAL_MODULES = [
-    #'my_extra_api_definitions',
-    ]
-
-
-
-import sys
-import os
-
-sys.path.insert(0, sys.argv[2])
-
-from pybindgen import FileCodeSink, write_preamble
-from pybindgen.module import MultiSectionFactory
-
-import pybindgen.settings
-pybindgen.settings.deprecated_virtuals = False
-
-from ns3modulegen_generated import module_init, register_types, register_methods, register_functions
-import ns3modulegen_core_customizations
-import callbacks_list
-import traceback
-
-this_script_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
-
-class ErrorHandler(pybindgen.settings.ErrorHandler):
-    def handle_error(self, wrapper, exception, traceback_):
-        print >> sys.stderr
-        print >> sys.stderr, "---- location:"
-        traceback.print_stack()
-        print >> sys.stderr, "---- error:"
-        traceback.print_tb(traceback_)
-        try:
-            stack = wrapper.stack_where_defined
-        except AttributeError:
-            print >> sys.stderr, "??:??: %s / %r" % (wrapper, exception)
-        else:
-            stack = list(stack)
-            stack.reverse()
-            for (filename, line_number, function_name, text) in stack:
-                file_dir = os.path.dirname(os.path.abspath(filename))
-                if file_dir.startswith(this_script_dir):
-                    print >> sys.stderr, "%s:%i: %r" % (os.path.join("..", "bindings", "python", os.path.basename(filename)),
-                                                        line_number, exception)
-                    break
-        return True
-pybindgen.settings.error_handler = ErrorHandler()
-
-pybindgen.settings.wrapper_registry = pybindgen.settings.StdMapWrapperRegistry
-
-
-class MyMultiSectionFactory(MultiSectionFactory):
-
-    def __init__(self, main_file_name, modules):
-        super(MyMultiSectionFactory, self).__init__()
-        self.main_file_name = main_file_name
-        self.main_sink = FileCodeSink(open(main_file_name, "wt"))
-        self.header_name = "ns3module.h"
-        header_file_name = os.path.join(os.path.dirname(self.main_file_name), 'pch', self.header_name)
-        self.header_sink = FileCodeSink(open(header_file_name, "wt"))
-        self.section_sinks = {'__main__': self.main_sink}
-
-        for module in modules:
-            section_name = 'ns3_module_%s' % module.replace('-', '_')
-            file_name = os.path.join(os.path.dirname(self.main_file_name), "%s.cc" % section_name)
-            sink = FileCodeSink(open(file_name, "wt"))
-            self.section_sinks[section_name] = sink            
-
-    def get_section_code_sink(self, section_name):
-        return self.section_sinks[section_name]
-
-    def get_main_code_sink(self):
-        return self.main_sink
-
-    def get_common_header_code_sink(self):
-        return self.header_sink
-
-    def get_common_header_include(self):
-        return '"%s"' % self.header_name
-
-    def close(self):
-        self.header_sink.file.close()
-        self.main_sink.file.close()
-        for sink in self.section_sinks.values():
-            sink.file.close()
-
-
-
-def main():
-    out = MyMultiSectionFactory(sys.argv[1], sys.argv[3:])
-    root_module = module_init()
-    root_module.add_include('"everything.h"')
-
-    register_types(root_module)
-
-    ns3modulegen_core_customizations.Simulator_customizations(root_module)
-    ns3modulegen_core_customizations.CommandLine_customizations(root_module)
-    ns3modulegen_core_customizations.TypeId_customizations(root_module)
-    ns3modulegen_core_customizations.add_std_ofstream(root_module)
-    ns3modulegen_core_customizations.add_ipv4_address_tp_hash(root_module)
-
-
-    for local_module in LOCAL_MODULES:
-        mod = __import__(local_module)
-        mod.register_types(root_module)
-
-    ns3modulegen_core_customizations.generate_callback_classes(root_module.after_forward_declarations,
-                                                               callbacks_list.callback_classes)
-
-
-    register_methods(root_module)
-
-    for local_module in LOCAL_MODULES:
-        mod = __import__(local_module)
-        mod.register_methods(root_module)
-
-    ns3modulegen_core_customizations.Object_customizations(root_module)
-    ns3modulegen_core_customizations.Attribute_customizations(root_module)
-
-    register_functions(root_module)
-
-    for local_module in LOCAL_MODULES:
-        mod = __import__(local_module)
-        mod.register_functions(root_module)
-
-    enabled_features = os.environ['NS3_ENABLED_FEATURES'].split(',')
-
-    # if GtkConfigStore support is disabled, disable the class wrapper
-    if 'GtkConfigStore' not in enabled_features:
-        try:
-            root_module.classes.remove(root_module['ns3::GtkConfigStore'])
-        except KeyError:
-            pass
-
-    # if no sqlite, the class SqliteDataOutput is disabled
-    if 'SqliteDataOutput' not in enabled_features:
-        try:
-            root_module.classes.remove(root_module['ns3::SqliteDataOutput'])
-        except KeyError:
-            pass
-
-    if 'Threading' not in enabled_features:
-        for clsname in ['SystemThread', 'SystemMutex', 'SystemCondition', 'CriticalSection',
-                        'SimpleRefCount< ns3::SystemThread, ns3::empty, ns3::DefaultDeleter<ns3::SystemThread> >']:
-            root_module.classes.remove(root_module['ns3::%s' % clsname])
-
-    if 'EmuNetDevice' not in enabled_features:
-        for clsname in ['EmuNetDevice', 'EmuHelper']:
-            root_module.classes.remove(root_module['ns3::%s' % clsname])
-        root_module.enums.remove(root_module['ns3::EmuNetDevice::EncapsulationMode'])
-
-    if 'RealTime' not in enabled_features:
-        for clsname in ['WallClockSynchronizer', 'RealtimeSimulatorImpl']:
-            root_module.classes.remove(root_module['ns3::%s' % clsname])
-        root_module.enums.remove(root_module['ns3::RealtimeSimulatorImpl::SynchronizationMode'])
-
-    if 'TapBridge' not in enabled_features:
-        for clsname in ['TapBridge', 'TapBridgeHelper', 'TapBridgeFdReader']:
-            root_module.classes.remove(root_module['ns3::%s' % clsname])
-        root_module.enums.remove(root_module['ns3::TapBridge::Mode'])
-
-    root_module.generate(out, '_ns3')
-
-    out.close()
-
-if __name__ == '__main__':
-    if 0:
-        try:
-            import cProfile as profile
-        except ImportError:
-            main()
-        else:
-            print >> sys.stderr, "** running under profiler"
-            profile.run('main()', 'ns3modulegen.pstat')
-    else:
-        main()
-
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/CHANGES.html ns-3.35/CHANGES.html
--- ns-3.34/CHANGES.html	2021-07-14 10:32:18.000000000 -0700
+++ ns-3.35/CHANGES.html	2021-10-01 13:27:51.000000000 -0700
@@ -51,6 +51,42 @@
 us a note on ns-developers mailing list.</p>
 
 <hr>
+<h1>Changes from ns-3.34 to ns-3.35</h1>
+<h2>New API:</h2>
+<ul>
+<li>In class <b>Ipv6Header</b>, new functions SetSource (), SetDestination (), GetSource () and GetDestination () are added, consistent with <b>Ipv4Header</b>. The existing functions had "Address" suffix in each of the function names, and are are deprecated now.</li>
+<li>In class <b>Ipv4InterfaceAddress</b>, new functions SetAddress () and GetAddress () are added, corresponding to SetLocal () and GetLocal () respectively. This is done to keep consistency with <b>Ipv4InterfaceAddress</b>.</li>
+<li>With the new support for IPv6 Nix-Vector routing, we have all the new APIs corresponding to IPv4 Nix-Vector routing. Specific to the user, there is an Ipv6NixVectorHelper class which can be set in the InternetStackHelper, and works similar to Ipv4NixVectorHelper.</li>
+<li>In class <b>Ipv4InterfaceAddress</b>, a new function IsInSameSubnet () is added to check if both the IPv4 addresses are in the same subnet. Also, it is consistent with <b>Ipv6InterfaceAddress::IsInSameSubnet ()</b>.</li>
+<li>In class <b>ConfigStore</b>, a new Attribue <b>SaveDeprecated</b> allows to not save DEPRECATED Attributes. The default value is <b>false</b> (save DEPRECATED Attributes).</li>
+<li>In class <b>TracedCallback</b>, a new function <b>IsEmpty</b> allows to know if the TracedCallback will call any callback.</li>
+<li>A new specialization of std::hash for Ptr allows one to use Ptrs as keys in unordered_map and unordered_set containers.</li>
+<li>A new <b>GroupMobilityHelper</b> mobility helper has been added to ease the configuration of group mobility (a form of hierarchical mobility in which multiple child mobility models move with reference to an underlying parent mobility model).  New example programs and animation scripts are also added to both the buildings and mobility modules.</li>
+</ul>
+<h2>Changes to existing API:</h2>
+<ul>
+<li>In class <b>Ipv6Header</b>, the functions SetSourceAddress (), SetDestinationAddress (), GetSourceAddress () and GetDestinationAddress () are deprecated. New corresponding functions are added by removing the "Address" suffix. This change is made for having consistency with <b>Ipv4Header</b>.</li>
+<li><b>ipv4-nix-vector-helper.h</b> and <b>ipv4-nix-vector-routing.h</b> have been deprecated in favour of <b>nix-vector-helper.h</b> and <b>nix-vector-routing.h</b> respectively.</li>
+</ul>
+<h2>Changes to build system:</h2>
+<ul>
+<li>The default C++ standard is now C++17.</li>
+<li>The minimum compiler versions have been raised to g++-7 and clang-10 (Linux) and Xcode 11 (macOS).</li>
+</ul>
+<h2>Changed behavior:</h2>
+<ul>
+<li>Nix-Vector routing supports topologies with multiple WiFi networks using the same WiFi channel object.</li>
+<li>ConfigStore no longer saves OBSOLETE attributes.</li>
+<li>The <b>Ipv4L3Protocol</b> Duplicate detection now accounts for transmitted packets, so a transmitting multicast node will not forward its own packets.</li>
+<li>Wi-Fi: A-MSDU aggregation now implies that constituent MSDUs are immediately dequeued
+from the EDCA queue and replaced by an MPDU containing the A-MSDU. Thus, aggregating N
+MSDUs triggers N dequeue operations and 1 enqueue operation on the EDCA queue.</li>
+<li>Wi-Fi: MPDUs being passed to the PHY layer for transmission are not dequeued, but
+are kept in the EDCA queue until they are acknowledged or discarded. Consequently, the
+BlockAckManager retransmit queue has been removed.</li>
+</ul>
+
+<hr>
 <h1>Changes from ns-3.33 to ns-3.34</h1>
 <h2>New features and API:</h2>
 <ul>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/contrib/wscript ns-3.35/contrib/wscript
--- ns-3.34/contrib/wscript	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/contrib/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -284,10 +284,8 @@
             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_35=', '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.34/doc/doxygen.conf ns-3.35/doc/doxygen.conf
--- ns-3.34/doc/doxygen.conf	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/doxygen.conf	2021-10-01 13:26:47.000000000 -0700
@@ -2214,6 +2214,7 @@
                          NS3_BUILD_PROFILE_DEBUG \
                          NS3_BUILD_PROFILE_RELEASE \
                          NS3_BUILD_PROFILE_OPTIMIZED \
+                         DOXYGEN_SHOULD_SKIP_THIS \
                          INT64X64_USE_CAIRO \
                          INT64X64_USE_DOUBLE \
                          INT64X64_USE_CAIRO \
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/manual/source/conf.py ns-3.35/doc/manual/source/conf.py
--- ns-3.34/doc/manual/source/conf.py	2021-07-14 10:32:18.000000000 -0700
+++ ns-3.35/doc/manual/source/conf.py	2021-10-01 13:27:51.000000000 -0700
@@ -73,9 +73,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.34'
+version = u'ns-3.35'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.34'
+release = u'ns-3.35'
 
 # 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.34/doc/manual/source/python.rst ns-3.35/doc/manual/source/python.rst
--- ns-3.34/doc/manual/source/python.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/manual/source/python.rst	2021-10-01 13:26:47.000000000 -0700
@@ -300,7 +300,7 @@
 
 .. sourcecode:: bash
 
-    sudo pip3 install --user cxxfilt
+    pip3 install --user cxxfilt
 
 See also the wiki for installation notes for your system.
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/manual/source/working-with-git.rst ns-3.35/doc/manual/source/working-with-git.rst
--- ns-3.34/doc/manual/source/working-with-git.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/manual/source/working-with-git.rst	2021-10-01 13:26:47.000000000 -0700
@@ -288,110 +288,144 @@
 a named release such as 'ns-3.30' can be checked out on a branch by specifying
 the release name 'ns-3.30' (or 'ns-3.30.1' etc.).
 
-To facilitate this, let's look at a toy repository and the git commands
-involved.  This repository is initialized with a few files (``a``, ``b``, 
-``c``, and ``README.md``) and a ``VERSION`` file.  ``VERSION`` is always
-kept on the string ``3-dev`` in the ``master`` branch, but is changed to
-the release number in the release branches.
+A compact way to represent a git history is the following command:
 
 ::
 
-  $ ls
-  a  b  c  README.md  VERSION
+  $ git log --graph --decorate --oneline --all
 
-The git log command can be appended with some arguments to display the
-branch history:
+At the point just before the ns-3.34 release, the log looked like this:
 
 ::
 
-  $ git log --graph --decorate --oneline --all
-  * d3e953b (HEAD -> master) Add VERSION file
-  * 62b05c5 Add three files a, b, and c
-  * 3e124c8 (origin/master, origin/HEAD) Initial commit
+  * 9df8ef4 (HEAD -> master) doc: Update ns-3 version in tutorial examples
+  * 9319cdd (origin/master, origin/HEAD) Update CHANGES.html and RELEASE_NOTES
+  * 8da68b5 wifi: Fix typo in channel access manager test
 
-  $ cat VERSION
-  3-dev
+We want the release to create a small branch that is merged (in a special
+way) back to the mainline, yielding something like this:
 
-  $ git branch -a
-  * master
-    remotes/origin/HEAD -> origin/master
-    remotes/origin/master
+::
 
+  * 4b27025 (master) Update release files to start next release
+  *   fd075f6 Merge ns-3.34-release branch
+  |\
+  | * 3fab3cf (HEAD, tag: ns-3.34) Update availability in RELEASE_NOTES
+  | * c50aaf7 Update VERSION and documentation tags for ns-3.34 release
+  |/
+  * 9df8ef4 doc: Update ns-3 version in tutorial examples
+  * 9319cdd (origin/master, origin/HEAD) Update CHANGES.html and RELEASE_NOTES
+
+The first commit on the release branch changes the '3-dev' string in VERSION
+and the various documentation conf.py files to '3.34'.  The second commit
+on the release branch updates RELEASE_NOTES to state the URL of the release.
+
+Starting with commit 9df8ef4, the following steps were taken to create the
+ns-3.34 release.  First, this commit hash '9df8ef4' will be used later in
+the merge process.
 
-Now, let's create a notional ns-3.1 release.
+First, create a new release branch locally:
 
 ::
 
-  $ git checkout -b 'ns-3.1-release'
-  Switched to a new branch 'ns-3.1-release'
+  $ git checkout -b 'ns-3.34-release'
+  Switched to a new branch 'ns-3.34-release'
 
-We change the VERSION field from '3-dev' to '3.1'::
+We change the VERSION field from '3-dev' to '3.34'::
 
-  $ sed -i 's/3-dev/3.1/g' VERSION
+  $ sed -i 's/3-dev/3.34/g' VERSION
   $ cat VERSION
-  3.1
-  $ git commit -m"Update VERSION to 3.1" VERSION
+  3.34
+
+We next change the file conf.py in the tutorial, manual, and models directories
+to change the strings 'ns-3-dev' to ns-3.34.
+
+When you are done, the 'git status' command should show:
+
+::
+
+  VERSION                     | 2 +-
+  doc/manual/source/conf.py   | 4 ++--
+  doc/models/source/conf.py   | 4 ++--
+  doc/tutorial/source/conf.py | 4 ++--
+
+Make a commit of these files:
+
+  $ git commit -a -m"Update VERSION and documentation tags for ns-3.34 release"
+
+Next, make the following change to RELEASE_NOTES and commit it:
+
+::
+   Availability
+   ------------
+  -This release is not yet available.
+  +This release is available from:
+  +https://www.nsnam.org/release/ns-allinone-3.34.tar.bz2
+
+  $ git commit -m"Update availability in RELEASE_NOTES" RELEASE_NOTES
+
+Finally, add a git annotated tag:
   
-Let's release this.  Add a git annotated tag as follows::
+::
 
-  $ git tag -a 'ns-3.1' -m"ns-3.1 release"
+  $ git tag -a 'ns-3.34' -m"ns-3.34 release"
 
 Now, let's merge back to ``master``.  However, we want to avoid touching
-the ``VERSION`` file on ``master``; we want all other changes and tags
-but this one.  We can accomplish this with a special merge as follows.
+the ``VERSION`` and ``conf.py`` files on ``master``; we want the RELEASE_NOTES
+change and new tag.  We can accomplish this with a special merge as follows.
 
 ::
 
   $ git checkout master
-  $ git merge --no-commit --no-ff ns-3.1-release
+  $ git merge --no-commit --no-ff ns-3.34-release
   Automatic merge went well; stopped before committing as requested
 
 Now, we want to reset VERSION to the previous string, which existed before
 we branched.  We can use ``git reset`` on this file and then finish the merge.
-Recall its commit hash of ``d3e953b`` from above
+Recall its commit hash of ``9df8ef4`` from above.
 
 ::
 
-  $ git reset d3e953b VERSION
+  $ git reset 9df8ef4 VERSION
   Unstaged changes after reset:
   M	VERSION
-  $ sed -i 's/3.1/3-dev/g' VERSION
+  $ sed -i 's/3.34/3-dev/g' VERSION
   $ cat VERSION
   3-dev
 
+Repeat the above resets and change back to ``3-dev`` for each conf.py file.
+
 Finally, commit the branch and delete our local release branch.
 
 ::
 
-  $ git commit -m"Merge ns-3.1-release branch"
-  $ git branch -d ns-3.1-release
+  $ git commit -m"Merge ns-3.34-release branch"
+  $ git branch -d ns-3.34-release
 
 The git history now looks like this::
 
   $ git log --graph --decorate --oneline --all
-  *   80de6c5 (HEAD -> master) Merge ns-3.1-release branch
-  |\  
-  | * 5718d61 (tag: ns-3.1, ns-3.1-release) Update VERSION to 3.1
-  |/  
-  * d3e953b Add VERSION file
-  * 62b05c5 Add three files a, b, and c
-  * 3e124c8 (origin/master, origin/HEAD) Initial commit
-  $ git tag
-  ns-3.1
+  *   fd075f6 (HEAD -> master) Merge ns-3.34-release branch
+  |\
+  | * 3fab3cf (HEAD, tag: ns-3.34) Update availability in RELEASE_NOTES
+  | * c50aaf7 Update VERSION and documentation tags for ns-3.34 release
+  |/
+  * 9df8ef4 doc: Update ns-3 version in tutorial examples
+  * 9319cdd (origin/master, origin/HEAD) Update CHANGES.html and RELEASE_NOTES
 
 This may now be pushed to ``nsnam/ns-3-dev.git`` and development can continue.
 
-**Note:**  When pushing to the remote, don't forget to push the tags::
+**Important:**  When pushing to the remote, don't forget to push the tags::
 
   $ git push --follow-tags
 
-Future users who want to check out the ns-3.1 release will do something like::
+Future users who want to check out the ns-3.34 release will do something like::
 
-  $ git checkout -b my-local-ns-3.1 ns-3.1
-  Switched to a new branch 'my-local-ns-3.1'
+  $ git checkout -b my-local-ns-3.34 ns-3.34
+  Switched to a new branch 'my-local-ns-3.34'
 
 **Note:**  It is a good idea to avoid naming the new branch the same as the tag
-name; in this case, 'ns-3.1'.
+name; in this case, 'ns-3.34'.
 
 Let's assume now that master evolves with new features and bugfixes.  They
 are committed to ``master`` on ``nsnam/ns-3-dev.git`` as usual::
@@ -416,41 +450,41 @@
   * 9a3432a some more changes
   * ba28d6d Add new feature
   * e50015a make some changes
-  *   80de6c5 Merge ns-3.1-release branch
-  |\  
-  | * 5718d61 (tag: ns-3.1) Update VERSION to 3.1
-  |/  
-  * d3e953b Add VERSION file
-  * 62b05c5 Add three files a, b, and c
-  * 3e124c8 (origin/master, origin/HEAD) Initial commit
+  *   fd075f6 Merge ns-3.34-release branch
+  |\
+  | * 3fab3cf (tag: ns-3.34) Update availability in RELEASE_NOTES
+  | * c50aaf7 Update VERSION and documentation tags for ns-3.34 release
+  |/
+  * 9df8ef4 doc: Update ns-3 version in tutorial examples
+  * 9319cdd Update CHANGES.html and RELEASE_NOTES
 
 Let's assume that the changeset ``ee37d41`` is considered important to fix in
-the ns-3.1 release, but we don't want the other changes introduced since then.
+the ns-3.34 release, but we don't want the other changes introduced since then.
 The solution will be to create a new branch for a hotfix release, and follow
-similar steps.  The branch for the hotfix should come from commit ``5718d61``,
+similar steps.  The branch for the hotfix should come from commit ``3fab3cf``,
 and should cherry-pick commit ``ee37d41`` (which may require merge if it
 doesn't apply cleanly), and then the hotfix branch can be tagged and merged
 as was done before.
 
 ::
 
-  $ git checkout -b ns-3.1.1-release ns-3.1
+  $ git checkout -b ns-3.34.1-release ns-3.34
   $ git cherry-pick ee37d41
   ... (resolve any conflicts)
   $ git add a
   $ git commit
-  $ sed -i 's/3.1/3.1.1/g' VERSION
+  $ sed -i 's/3.34/3.34.1/g' VERSION
   $ cat VERSION
-  3.1.1
-  $ git commit -m"Update VERSION to 3.1.1" VERSION
-  $ git tag -a 'ns-3.1.1' -m"ns-3.1.1 release"
+  3.34.1
+  $ git commit -m"Update VERSION to 3.34.1" VERSION
+  $ git tag -a 'ns-3.34.1' -m"ns-3.34.1 release"
 
 Now the merge::
 
   $ git checkout master
-  $ git merge --no-commit --no-ff ns-3.1.1-release
+  $ git merge --no-commit --no-ff ns-3.34.1-release
 
-This time we see::
+This time we may see something like::
 
   Auto-merging a
   CONFLICT (content): Merge conflict in a
@@ -480,32 +514,35 @@
     (use "git commit" to conclude merge)
 
   $ git commit
-  $ git branch -d ns-3.1.1-release
+  $ git branch -d ns-3.34.1-release
 
-The new log should show::
+The new log should show something like the below, with parallel git
+history paths until the merge back again::
   
   $ git log --graph --decorate --oneline --all
-  *   815ce6e (HEAD -> master) Merge branch 'ns-3.1.1-release'
+  *   815ce6e (HEAD -> master) Merge branch 'ns-3.34.1-release'
   |\  
-  | * 12a29ca (tag: ns-3.1.1, ns-3.1.1-release) Update VERSION to 3.1.1
+  | * 12a29ca (tag: ns-3.34.1) Update VERSION to 3.34.1
   | * 21ebdbf Fix missing abc bug on file a
   * | ee37d41 Fix missing abc bug on file a
   * | 9a3432a some more changes
   * | ba28d6d Add new feature
   * | e50015a make some changes
-  * |   80de6c5 Merge ns-3.1-release branch
+  * |   fd075f6 Merge ns-3.34-release branch
   |\ \  
   | |/  
-  | * 5718d61 (tag: ns-3.1) Update VERSION to 3.1
-  |/  
-  * d3e953b Add VERSION file
-  * 62b05c5 Add three files a, b, and c
-  * 3e124c8 (origin/master, origin/HEAD) Initial commit
+  | * 3fab3cf (tag: ns-3.34) Update availability in RELEASE_NOTES
+  | * c50aaf7 Update VERSION and documentation tags for ns-3.34 release
+  |/
+  * 9df8ef4 doc: Update ns-3 version in tutorial examples
+  * 9319cdd Update CHANGES.html and RELEASE_NOTES
+
+  $ git push origin master:master --follow-tags
 
 And we can continue to commit on top of master going forward.  The two
-tags are::
+tags should be found in the ``git tag`` output (among other tags)::
 
   $ git tag
-  ns-3.1
-  ns-3.1.1
+  ns-3.34
+  ns-3.34.1
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/models/source/conf.py ns-3.35/doc/models/source/conf.py
--- ns-3.34/doc/models/source/conf.py	2021-07-14 10:32:18.000000000 -0700
+++ ns-3.35/doc/models/source/conf.py	2021-10-01 13:27:51.000000000 -0700
@@ -73,9 +73,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.34'
+version = u'ns-3.35'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.34'
+release = u'ns-3.35'
 
 # 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.34/doc/release_steps.txt ns-3.35/doc/release_steps.txt
--- ns-3.34/doc/release_steps.txt	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/release_steps.txt	2021-10-01 13:26:47.000000000 -0700
@@ -21,7 +21,6 @@
 otherwise, this becomes painful to edit (and things are forgotten)
 when the release is imminent.
 
-Also, edit the tutorial "Getting Started" page to update the release number.
 
 2) preparing release candidates for testing
 -------------------------------------------
@@ -40,12 +39,22 @@
    - confirm that the new bake configurations for the release work correctly
    - confirm all documents build:  './waf docs' and check outputs
 
-Check out a clean ns-3-dev somewhere using ns-3-allinone 
+2.1)  Update the tutorial "Getting Started" and "Quick Start" pages to use the new release number.
+
+An example commit (July 14, 2021) to review is 9df8ef4b2.
+
+2.2) Prepare some bakeconf.xml updates for the new release.  Note that the
+new release 'ns-3.x' will not be yet available as a tagged release, so
+the 'ns-3.x' module may need some indirection to fetch ns-3-dev in its place.
+
+2.3) Check out a clean ns-3-dev somewhere using ns-3-allinone 
    - git clone https://gitlab.com/nsnam/ns-3-allinone.git
    - cd ns-3-allinone
    - ./download.py
    - cd ns-3-dev
    - edit VERSION such as "ns-3.31.rc1" (DO NOT commit this change to ns-3-dev)
+   - cd ../bake
+   - copy over the modified bakeconf.xml that is being tested
    - cd ..
    - ./dist.py
 
@@ -53,7 +62,9 @@
 Test this, and when satisfied, upload it to
 www.nsnam.org:/var/www/html/releases/ (with apache:apache file ownership)
 
-Announce it to ns-developers as:
+Release candidates from previous releases can be deleted at this point.
+
+Announce the release candidate to ns-developers as:
 https://www.nsnam.org/release/ns-allinone-3.31.rc1.tar.bz2
 
 Iterate the above as needed during the release testing phase.
@@ -73,38 +84,69 @@
 creating the distribution tarball
 ---------------------------------
 
-1. Create final tarballs
-    You need to work with a clean ns-3-allinone-3.x directory, assuming that
-    ns-3-dev is ready for inclusion as is, just with a modified VERSION file
+1. Create a tagged release on gitlab.com:nsnam/ns-3-dev
+
+For this step, consult the ns-3 manual:
+https://www.nsnam.org/docs/manual/html/working-with-git.html#making-a-release
+
+The desired outcome is to have a git commit history looking like this:
+
+$ git log --graph --decorate --oneline --all
+* 4b27025 (master) Update release files to start next release
+*   fd075f6 Merge ns-3.34-release branch
+|\
+| * 3fab3cf (HEAD, tag: ns-3.34) Update availability in RELEASE_NOTES
+| * c50aaf7 Update VERSION and documentation tags for ns-3.34 release
+|/
+* 9df8ef4 doc: Update ns-3 version in tutorial examples
+* 9319cdd (origin/master, origin/HEAD) Update CHANGES.html and RELEASE_NOTES
+
+2.  Create a final bakeconf.xml and commit it.
+
+Now that the ns-3.34 tagged release is available, a final bakeconf.xml with
+final release components can be committed.  For a sample commit, view
+bake commit ba47854c (July 14, 2021).
+
+3.  Create a final distribution tarball
    - git clone https://gitlab.com/nsnam/ns-3-allinone.git
    - cd ns-3-allinone
    - ./download.py
    - cd ns-3-dev
-   - edit VERSION to the proper '3.x' string  (but do not commit this change)
+   - git checkout -b 'ns-3.x-release' ns-3.x
    - cd ../
    - ./dist.py (notice we did not build here)
    - this will create an ns-allinone-3.x.tar.bz2 tarball
-   - sanity check this tarball just to make sure everything went ok
 
-2. upload "ns-allinone-3.x.tar.bz2" to the /var/www/html/releases/ directory on 
+4.  Test this tarball on at least one system
+   - check that ns-3-allinone build.py works
+   - check that bake ns-3.x and ns-allinone-3.x targets work
+
+5. upload "ns-allinone-3.x.tar.bz2" to the /var/www/html/releases/ directory on 
    the www.nsnam.org server
    - scp ns-allinone-3.x.tar.bz2 www.nsnam.org:~
    - ssh www.nsnam.org
    - sudo cp ns-allinone-3.x.tar.bz2 /var/www/html/releases
    - cd !$
 
-3. give it 644 file permissions, and user/group = apache if it is not already
+6. give it 644 file permissions, and user/group = apache if it is not already
    - sudo chown apache:apache ns-allinone-3.x.tar.bz2
    - sudo chmod 644 ns-allinone-3.x.tar.bz2
 
-4. if this is a final release (not RC)
-   - delete RC releases from /var/www/html/releases
+7. Create a patch file for the releases/patches directory, and upload it
+   to the server.  The main idea is to extract the previous release's
+   ns-3.(x-1) directory and the new ns-3.x directory, and run a diff over it.
+   - mkdir patchdir && cd patchdir
+   - wget https://www.nsnam.org/releases/ns-allinone-3.(x-1).tar.bz2
+   - tar xjf ns-allinone-3.(x-1).tar.bz2
+   - mv ns-allinone-3.(x-1)/ns-3.(x-1) .
+   - wget https://www.nsnam.org/releases/ns-allinone-3.x.tar.bz2
+   - tar xjf ns-allinone-3.x.tar.bz2
+   - mv ns-allinone-3.x/ns-3.x .
+   - diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.(x-1) ns-3.x > ns-3.(x-1)-to-ns-3.x.patch
 
 preparing the documentation
 ----------------------------
 
-Note:  The below scripts currently presume mercurial and must be updated
-
 1. If final release, build release documentation
    - sudo bash; su nsnam; cd /home/nsnam/bin 
    - ./update-docs -c -R -r ns-3.x 
@@ -128,11 +170,6 @@
 
 4. Create a blog entry to announce release 
 
-patch for upgrade
------------------
-Prepare a patch for upgrading from ns-3.(x-1) to ns-3.x, and upload to
-the releases directory on the web server.
-
 ns-3 wiki edits
 ---------------
 
@@ -153,7 +190,6 @@
 
 2. announce to ns-developers and ns-3-users, with summary of release notes
 
-
 4) maintaining the release
 --------------------------
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/tutorial/source/conceptual-overview.rst ns-3.35/doc/tutorial/source/conceptual-overview.rst
--- ns-3.34/doc/tutorial/source/conceptual-overview.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/tutorial/source/conceptual-overview.rst	2021-10-01 13:26:47.000000000 -0700
@@ -1,6 +1,8 @@
 .. include:: replace.txt
 .. highlight:: cpp
 
+.. _Conceptual Overview:
+
 Conceptual Overview
 -------------------
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/tutorial/source/conf.py ns-3.35/doc/tutorial/source/conf.py
--- ns-3.34/doc/tutorial/source/conf.py	2021-07-14 10:32:18.000000000 -0700
+++ ns-3.35/doc/tutorial/source/conf.py	2021-10-01 13:27:51.000000000 -0700
@@ -71,9 +71,9 @@
 # built documents.
 #
 # The short X.Y version.
-version = u'ns-3.34'
+version = u'ns-3.35'
 # The full version, including alpha/beta/rc tags.
-release = u'ns-3.34'
+release = u'ns-3.35'
 
 # 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.34/doc/tutorial/source/getting-started.rst ns-3.35/doc/tutorial/source/getting-started.rst
--- ns-3.34/doc/tutorial/source/getting-started.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/tutorial/source/getting-started.rst	2021-10-01 13:26:47.000000000 -0700
@@ -1,6 +1,8 @@
 .. include:: replace.txt
 .. highlight:: bash
 
+.. _Getting Started:
+
 Getting Started
 ---------------
 
@@ -68,7 +70,7 @@
 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.34), the following tools
+As of the most recent |ns3| release (ns-3.35), the following tools
 are needed to get started with |ns3|:
 
 ============  ===========================================================
@@ -124,21 +126,21 @@
   $ cd
   $ mkdir workspace
   $ cd workspace
-  $ wget https://www.nsnam.org/release/ns-allinone-3.34.tar.bz2
-  $ tar xjf ns-allinone-3.34.tar.bz2
+  $ wget https://www.nsnam.org/release/ns-allinone-3.35.tar.bz2
+  $ tar xjf ns-allinone-3.35.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.34``, you should see a number of files and directories
+``ns-allinone-3.35``, you should see a number of files and directories
 
 .. sourcecode:: text
 
-  $ cd ns-allinone-3.34
+  $ cd ns-allinone-3.35
   $ ls
-  bake      constants.py   ns-3.34                            README
+  bake      constants.py   ns-3.35                            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
@@ -189,7 +191,7 @@
 
 .. sourcecode:: bash
 
-  $ python3 download.py -n ns-3.34
+  $ python3 download.py -n ns-3.35
 
 After this step, the additional repositories of |ns3|, bake, pybindgen,
 and netanim will be downloaded to the ``ns-3-allinone`` directory.
@@ -258,12 +260,11 @@
 
 There are a few configuration targets available:
 
-1.  ``ns-3.34``:  the module corresponding to the release; it will download
+1.  ``ns-3.35``:  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.34``:  the module that includes other optional features
-    such as Click routing, Openflow for |ns3|, and the Network Simulation
-    Cradle
+3.  ``ns-allinone-3.35``:  the module that includes other optional features
+    such as bake build system, netanim animator, and pybindgen
 4.  ``ns-3-allinone``:  similar to the released version of the allinone
     module, but for development code.
 
@@ -279,7 +280,7 @@
 `"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.34``.
+this tutorial example with ``ns-3.35``.
 
 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.
@@ -307,7 +308,7 @@
 
 .. sourcecode:: bash
 
-  $ ./bake.py configure -e ns-3.34
+  $ ./bake.py configure -e ns-3.35
 
 Next, we'll ask bake to check whether we have enough tools to download
 various components.  Type:
@@ -363,7 +364,7 @@
   >> Searching for system dependency cmake - OK
   >> Downloading netanim-3.108 - OK
   >> Downloading pybindgen-0.22.0 (target directory:pybindgen) - OK
-  >> Downloading ns-3.34 (target directory:ns-3.34) - OK
+  >> Downloading ns-3.35 (target directory:ns-3.35) - OK
 
 The above suggests that three sources have been downloaded.  Check the
 ``source`` directory now and type ``ls``; one should see:
@@ -372,7 +373,7 @@
 
   $ cd source
   $ ls
-  netanim-3.108  ns-3.34  pybindgen
+  netanim-3.108  ns-3.35 pybindgen
 
 You are now ready to build the |ns3| distribution.
 
@@ -403,7 +404,7 @@
 
 If you downloaded
 using a tarball you should have a directory called something like 
-``ns-allinone-3.34`` under your ``~/workspace`` directory.  
+``ns-allinone-3.35`` under your ``~/workspace`` directory.  
 Type the following:
 
 .. sourcecode:: bash
@@ -422,7 +423,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.34/ns-3.34/build'
+   Waf: Leaving directory '/path/to/workspace/ns-allinone-3.35/ns-3.35/build'
    'build' finished successfully (6m25.032s)
   
    Modules built:
@@ -444,7 +445,7 @@
    Modules not built (see ns-3 tutorial for explanation):
    brite                  click                     openflow                  
 
-   Leaving directory ./ns-3.34
+   Leaving directory ./ns-3.35
 
 Regarding the portion about modules not built::
 
@@ -473,7 +474,7 @@
 
   >> Building pybindgen-0.22.0 - OK
   >> Building netanim-3.108 - OK
-  >> Building ns-3.34 - OK
+  >> Building ns-3.35 - 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
@@ -673,7 +674,7 @@
 .. sourcecode:: bash
 
   $ ./waf --check-profile
-  Waf: Entering directory \`/path/to/ns-3-allinone/ns-3.34/build\'
+  Waf: Entering directory \`/path/to/ns-allinone-3.35/ns-3.35/build\'
   Build profile: debug
 
 The build.py script discussed above supports also the ``--enable-examples``
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/tutorial/source/index.rst ns-3.35/doc/tutorial/source/index.rst
--- ns-3.34/doc/tutorial/source/index.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/tutorial/source/index.rst	2021-10-01 13:26:47.000000000 -0700
@@ -16,6 +16,7 @@
 .. toctree::
    :maxdepth: 2
 
+   quick-start
    introduction
    resources
    getting-started
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/tutorial/source/introduction.rst ns-3.35/doc/tutorial/source/introduction.rst
--- ns-3.34/doc/tutorial/source/introduction.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/doc/tutorial/source/introduction.rst	2021-10-01 13:26:47.000000000 -0700
@@ -1,5 +1,7 @@
 .. include:: replace.txt
 
+.. _Introduction:
+
 Introduction
 ------------
 
@@ -20,6 +22,9 @@
 and provide pointers to source code for those interested in delving deeper
 into the workings of the system.
 
+We also provide a quick start guide for those who are comfortable
+diving right in without too much documentation.
+
 A few key points are worth noting at the onset:
 
 * |ns3| is open-source, and the project strives to maintain an 
@@ -29,6 +34,7 @@
   it is a new simulator.  The two simulators are both written in C++ but 
   |ns3| is a new simulator that does not support the |ns2| APIs.
 
+
 About ns-3
 **********
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/doc/tutorial/source/quick-start.rst ns-3.35/doc/tutorial/source/quick-start.rst
--- ns-3.34/doc/tutorial/source/quick-start.rst	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/doc/tutorial/source/quick-start.rst	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,145 @@
+.. include:: replace.txt
+.. highlight:: bash
+
+.. _Quick Start:
+
+Quick Start
+-----------
+
+This section is optional, for readers who want to get |ns3| up and running
+as quickly as possible.  Readers may skip forward to the :ref:`Introduction`
+chapter, followed by the :ref:`Getting Started` chapter, for a lengthier
+coverage of all of this material.
+
+Brief Summary
+*************
+|ns3| is a discrete-event simulator typically run from the command line.
+It is written directly in C++, not in a high-level modeling language;
+simulation events are simply C++ function calls, organized by a scheduler.
+
+An |ns3| user will obtain the |ns3| source code (see below), 
+compile it into shared (or static) libraries, and link the libraries to 
+`main()` programs that he or she authors.  The `main()` program is where
+the specific simulation scenario configuration is performed and where the 
+simulator is run and stopped.  Several example programs are provided, which
+can be modified or copied to create new simulation scenarios.  Users also
+often edit the |ns3| library code (and rebuild the libraries) to change
+its behavior.
+
+|ns3| has optional Python bindings for authoring scenario configuration
+programs in Python (and using a Python-based workflow); this quick start
+does not cover those aspects.
+
+Prerequisites
+*************
+|ns3| has various optional extensions, but the main features just require
+a C++ compiler (g++ or clang++) and Python (version 3.6 or above); the
+Python is needed for the build system.  We focus in this chapter only on
+getting |ns3| up and running on a system supported by a recent C++ compiler
+and Python runtime support.
+
+For Linux, use either g++ or clang++ compilers.  For macOS, use clang++ 
+(available in Xcode or Xcode Command Line Tools).  For Windows, we recommend
+to either use a Linux virtual machine, or the Windows Subsystem for Linux. 
+
+Downloading ns-3
+****************
+
+|ns3| is distributed in source code only (some binary packages exist but
+they are not maintained by the open source project).  There are two
+main ways to obtain the source code:  1) downloading the latest release
+as a source code archive from the main |ns3| web site, or 2) cloning
+the Git repository from GitLab.com.  These two options are described next;
+either one or the other download option (but not both) should be followed.
+
+Downloading the Latest Release
+++++++++++++++++++++++++++++++
+
+1) Download the latest release from https://www.nsnam.org/releases/latest
+
+2) Unpack it in a working directory of your choice.
+
+   ::
+
+    $ tar xjf ns-allinone-3.35.tar.bz2
+
+3) Change into the |ns3| directory directly; e.g.
+
+   ::
+
+    $ cd ns-allinone-3.35/ns-3.35
+
+The ns-allinone directory has some additional components but we are skipping
+over them here; one can work directly from the |ns3| source code directory.
+
+Cloning ns-3 from GitLab.com
+++++++++++++++++++++++++++++
+
+You can perform a Git clone in the usual way:
+
+::
+
+  $ git clone https://gitlab.com/nsnam/ns-3-dev.git
+
+If you are content to work with the tip of the development tree; you need
+only to `cd` into ns-3-dev; the `master` branch is checked out by default.
+
+::
+
+  $ cd ns-3-dev
+
+If instead you want to try the most recent release (version 3.35 as of this
+writing), you can checkout a branch corresponding to that git tag:
+
+::
+
+  $ git checkout -b ns-3.35-branch ns-3.35
+
+Building and testing ns-3
+*************************
+
+Once you have obtained the source either by downloading a release or by
+cloning a Git repository, the next step is to
+configure the build using the *Waf* build system that comes with |ns3|.  There
+are several options to control the build, but enabling the example programs
+and the tests, for a default debug build profile (with debugging symbols
+and support for |ns3| logging) is what is usually done at first:
+
+::
+
+  $ ./waf configure --enable-examples --enable-tests
+
+Then, use Waf to build |ns3|:
+
+::
+
+  $ ./waf build
+
+Once complete, you can run the unit tests to check your build:
+
+::
+
+  $ ./test.py
+
+All tests should either PASS or be SKIPped.  At this point, you have a
+working |ns3| simulator.  From here, you can start to
+run programs (look in the examples directory).  To run the first tutorial
+program, whose source code is located at `examples/tutorial/first.cc`, 
+use Waf to run it (by doing so, the |ns3| shared libraries are found
+automatically):
+
+::
+
+  $ ./waf --run first
+
+To view possible command-line options, specify the `--PrintHelp` argument:
+
+::
+
+  $ ./waf --run 'first --PrintHelp'
+
+To continue reading about the conceptual model and architecture of |ns3|,
+the tutorial chapter :ref:`Conceptual Overview` would be the next natural place
+to skip to, or you can learn more about the project and the
+various build options by continuing directly with the :ref:`Introduction`
+and :ref:`Getting Started` chapters.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/examples/tcp/tcp-validation.cc ns-3.35/examples/tcp/tcp-validation.cc
--- ns-3.34/examples/tcp/tcp-validation.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/examples/tcp/tcp-validation.cc	2021-10-01 13:26:47.000000000 -0700
@@ -181,18 +181,22 @@
       double cwnd = static_cast<double> (newCwnd) / 1448;
       if ((now > 5.43) && (now < 5.465) && (cwnd < 500))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " cwnd " << cwnd << " (expected >= 500)");
           g_validationFailed = true;
         }
       else if ((now > 5.795) && (now < 6) && (cwnd > 190))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " cwnd " << cwnd << " (expected <= 190)");
           g_validationFailed = true;
         }
-      else if ((now > 14) && (now < 14.328) && (cwnd < 225))
+      else if ((now > 14) && (now < 14.197) && (cwnd < 224))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " cwnd " << cwnd << " (expected >= 224)");
           g_validationFailed = true;
         }
-      else if ((now > 17) && (now < 18.2) && (cwnd < 225))
+      else if ((now > 17) && (now < 18.026) && (cwnd < 212))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " cwnd " << cwnd << " (expected >= 212)");
           g_validationFailed = true;
         }
     }
@@ -211,14 +215,17 @@
       double now = Simulator::Now ().GetSeconds ();
       if ((now < 7.5) && (alpha < 0.1))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " alpha " << alpha << " (expected >= 0.1)");
           g_validationFailed = true;
         }
       else if ((now > 11) && (now < 30) && (alpha > 0.01))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " alpha " << alpha << " (expected <= 0.01)");
           g_validationFailed = true;
         }
       else if ((now > 34) && (alpha < 0.015) && (alpha > 0.025))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " alpha " << alpha << " (expected 0.015 <= alpha <= 0.025)");
           g_validationFailed = true;
         }
     }
@@ -227,10 +234,12 @@
       double now = Simulator::Now ().GetSeconds ();
       if ((now > 5.6) && (alpha > 0.1))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " alpha " << alpha << " (expected <= 0.1)");
           g_validationFailed = true;
         }
       if ((now > 7) && ((alpha > 0.09) || (alpha < 0.055)))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " alpha " << alpha << " (expected 0.09 <= alpha <= 0.055)");
           g_validationFailed = true;
         }
     }
@@ -351,14 +360,17 @@
       double now = Simulator::Now ().GetSeconds ();
       if ((now < 14) && (throughput > 20))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " throughput " << throughput << " (expected <= 20)");
           g_validationFailed = true;
         }
       if ((now < 30) && (throughput > 48))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " throughput " << throughput << " (expected <= 48)");
           g_validationFailed = true;
         }
       if ((now > 32) && ((throughput < 47.5) || (throughput > 48.5)))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " throughput " << throughput << " (expected 47.5 <= throughput <= 48.5)");
           g_validationFailed = true;
         }
     }
@@ -367,6 +379,7 @@
       double now = Simulator::Now ().GetSeconds ();
       if ((now > 5.6) && ((throughput < 48) || (throughput > 49)))
         {
+          NS_LOG_WARN ("now " << Now ().As (Time::S) << " throughput " << throughput << " (expected 48 <= throughput <= 49)");
           g_validationFailed = true;
         }
     }
@@ -628,8 +641,15 @@
   Config::SetDefault ("ns3::TcpSocketBase::UseEcn", StringValue ("On"));
 
   // Report on configuration
-  NS_LOG_DEBUG ("first TCP: " << firstTcpTypeId.GetName () << "; second TCP: " << secondTcpTypeId.GetName () << "; queue: " << queueTypeId.GetName () << "; ceThreshold: " << ceThreshold.GetSeconds () * 1000 << "ms");
-
+  if (enableSecondTcp)
+    {
+      NS_LOG_DEBUG ("first TCP: " << firstTcpTypeId.GetName () << "; second TCP: " << secondTcpTypeId.GetName () << "; queue: " << queueTypeId.GetName () << "; ceThreshold: " << ceThreshold.GetSeconds () * 1000 << "ms");
+    }
+  else 
+    {
+      NS_LOG_DEBUG ("first TCP: " << firstTcpTypeId.GetName () << "; queue: " << queueTypeId.GetName () << "; ceThreshold: " << ceThreshold.GetSeconds () * 1000 << "ms");
+    }
+  
   // Write traces only if we are not in validation mode (g_validate == "")
   std::ofstream pingOfStream;
   std::ofstream firstTcpRttOfStream;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/examples/wireless/wifi-spectrum-saturation-example.cc ns-3.35/examples/wireless/wifi-spectrum-saturation-example.cc
--- ns-3.34/examples/wireless/wifi-spectrum-saturation-example.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/examples/wireless/wifi-spectrum-saturation-example.cc	2021-10-01 13:26:47.000000000 -0700
@@ -60,7 +60,7 @@
 // attributes, global values, and default values typically available:
 //
 //    --simulationTime:  Simulation time in seconds [10]
-//    --distance:        meters separation between nodes [50]
+//    --distance:        meters separation between nodes [1]
 //    --index:           restrict index to single value between 0 and 31 [256]
 //    --wifiType:        select ns3::SpectrumWifiPhy or ns3::YansWifiPhy [ns3::SpectrumWifiPhy]
 //    --errorModelType:  select ns3::NistErrorRateModel or ns3::YansErrorRateModel [ns3::NistErrorRateModel]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/RELEASE_NOTES ns-3.35/RELEASE_NOTES
--- ns-3.34/RELEASE_NOTES	2021-07-14 10:32:18.000000000 -0700
+++ ns-3.35/RELEASE_NOTES	2021-10-01 13:27:51.000000000 -0700
@@ -9,6 +9,76 @@
 Consult the file CHANGES.html for more detailed information about changed
 API and behavior across ns-3 releases.
 
+Release 3.35
+============
+
+Availability
+------------
+This release is available from:
+https://www.nsnam.org/release/ns-allinone-3.35.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 11 or later
+
+Python API scanning only works for Python versions 3.6 through 3.8, due to
+an upstream toolchain limitation.
+
+This release has been tested on the following systems:
+- Fedora 34 with g++-11.2.1 and clang++-12.0.1; Python 3.9.7
+- Fedora 33 with g++-10.3.1 and clang++-11.0.0; Python 3.9.6
+- Ubuntu 21.04 with g++-11.1.and clang++-12.0.0; Python 3.9.5
+- Ubuntu 20.04 with g++-9.3.0 and clang++-10.0.0; Python 3.8.10
+- Ubuntu 18.04 with g++-7.5.0 and clang++-6.0.0; Python 3.6.9
+- macOS 10.15.7 (Catalina) with Xcode 12.4 (Apple clang-1200.0.32.29, Python 3.9.1)
+
+This release has discontinued support for g++-5 and g++-6 compilers, and
+for macOS Xcode 10.
+
+New user-visible features
+-------------------------
+ns-3 has switched to the C++17 standard by default, although the more
+advanced constructs (beyond C++11) are generally avoided in the header files,
+to stay compatible with the Python API scanning framework.
+
+- (antenna) Extend UniformPlanarArray to have a configurable polarization slant angle
+- (buildings) Add example program demonstrating group mobility with the buildings-aware random walk mobility model, and a script to animate the group motion.
+- (config-store) OBSOLETE Attributes are not anymore saved.
+- (config-store) New ConfigStore::SaveDeprecated Attribute (default false) to avoid to save DEPRECATED attributes.
+- (core) Add TracedCallback::IsEmpty to know if a TracedCallback has any callback associated.
+- (core) Add std::hash<ns3::Ptr<T>> to allow seamless use of Ptr as key in unordered_maps.
+- (core) Print available values on EnumChecker::GetValue () error
+- (internet) Added getters and setters for source and destination in Ipv6Header consistent with Ipv4Header naming.
+- (internet) New functions SetAddress () and GetAddress () are added, corresponding to SetLocal () and GetLocal () respectively in Ipv4InterfaceAddress to keep consistency with Ipv6InterfaceAddress.
+- (nix-vector-routing) Support for IPv6 Nix-Vector routing. Existing nix-simple and nms-p2p-nix examples are available in IPv6 as well.
+- (nix-vector-routing) ipv4-nix-vector-helper.h has been deprecated in favour of nix-vector-helper.h.
+- (nix-vector-routing) ipv4-nix-vector-routing.h has been deprecated in favour of nix-vector-routing.h.
+- (internet) Added new function IsInSameSubnet () in Ipv4InterfaceAddress similar to Ipv6InterfaceAddress::IsInSameSubnet (). It checks if the two Ipv4Address are in the same subnet.
+- (nix-vector-routing) Nix-Vector routing supports topologies with multiple WiFi networks using the same WiFi channel object.
+- (mobility) Add GroupMobilityHelper and demonstrate its use with a new program that configures the Reference Point Group Mobility model for a number of nodes.
+- (wifi) Add support for 11ax MU EDCA Parameter Set.
+- (wifi) MPDUs discarded because they became "old" (from the Block Ack agreement point of view) are now traced using the DroppedMpdu trace source of RegularWifiMac and with the WIFI_MAC_DROP_QOS_OLD_PACKET reason.
+
+Bugs fixed
+----------
+- (applications) #449, #453 - add correct receiving address to PacketSink traces for UDP.
+- (config-store) #443 - do not save obsolete attributes
+- (energy) #423 - SimpleDeviceEnergyModel calculation of consumed energy
+- (fd-net-device) #441 - Fix double dequeue on device stop
+- (internet) - Ipv4L3Protocol duplicate detection now accounts for sent packets, not just forwards.
+- (lte) !703 - Fix global-buffer-overflow when nprb is equal to zero
+- (mobility) - Initialize HierarchicalMobilityModel and avoid course change stream corruption
+- (nix-vector-routing) #450 - Avoid recalculation if path doesn't exist
+- (tcp) #407 - Align TcpCubic::GetSsThresh() with Linux
+- (tcp) #410 - Fix TcpWestwood bandwidth estimation bug
+- (traffic-control) #258 - Avoid overflow, divide-by-zero in TbfQueueDisc
+- (traffic-control) !706 - Fix FqPIE qdisc not using attributes
+- (wifi) - Always track interference when not locking on PPDU
+
 Release 3.34
 =============
 
@@ -25,13 +95,13 @@
 - 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)
+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 clang++-12.0.0; 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
 -------------------------
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/antenna/bindings/modulegen__gcc_ILP32.py ns-3.35/src/antenna/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/antenna/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/antenna/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -833,6 +833,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -860,6 +865,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/antenna/bindings/modulegen__gcc_LP64.py ns-3.35/src/antenna/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/antenna/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/antenna/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -833,6 +833,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -860,6 +865,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/antenna/doc/source/antenna-design.rst ns-3.35/src/antenna/doc/source/antenna-design.rst
--- ns-3.34/src/antenna/doc/source/antenna-design.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/antenna/doc/source/antenna-design.rst	2021-10-01 13:26:47.000000000 -0700
@@ -148,7 +148,7 @@
 
 * 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.
+* GetElementFieldPattern: returns the horizontal and vertical components of the antenna element field pattern at the specified direction. Same polarization (configurable) for all antenna elements of the array 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.
@@ -172,7 +172,8 @@
 and vertical elements can be configured through the attributes "AntennaHorizontalSpacing"
 and "AntennaVerticalSpacing". 
 
-Note: vertical polarization is assumed for each antenna element, as described in [38901]_ (i.e., :math:`{\zeta = 0}`).
+The polarization of each antenna element in the array is determined by the polarization
+slant angle through the attribute "PolSlantAngle", as described in [38901]_ (i.e., :math:`{\zeta}`).
 
 
 .. [Balanis] C.A. Balanis, "Antenna Theory - Analysis and Design",  Wiley, 2nd Ed.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/antenna/model/phased-array-model.h ns-3.35/src/antenna/model/phased-array-model.h
--- ns-3.34/src/antenna/model/phased-array-model.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/antenna/model/phased-array-model.h	2021-10-01 13:26:47.000000000 -0700
@@ -55,7 +55,7 @@
 
   /**
    * Returns the horizontal and vertical components of the antenna element field
-   * pattern at the specified direction. Only vertical polarization is considered.
+   * pattern at the specified direction. Single 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
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/antenna/model/uniform-planar-array.cc ns-3.35/src/antenna/model/uniform-planar-array.cc
--- ns-3.34/src/antenna/model/uniform-planar-array.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/antenna/model/uniform-planar-array.cc	2021-10-01 13:26:47.000000000 -0700
@@ -32,13 +32,7 @@
 
 
 UniformPlanarArray::UniformPlanarArray ()
-  : PhasedArrayModel (),
-    m_numColumns {1},
-    m_numRows {1},
-    m_disV {0.5},
-    m_disH {0.5},
-    m_alpha {0},
-    m_beta {0}
+  : PhasedArrayModel ()
 {}
 
 UniformPlanarArray::~UniformPlanarArray ()
@@ -78,12 +72,17 @@
     .AddAttribute ("BearingAngle",
                    "The bearing angle in radians",
                    DoubleValue (0.0),
-                   MakeDoubleAccessor (&UniformPlanarArray::m_alpha),
+                   MakeDoubleAccessor (&UniformPlanarArray::SetAlpha),
                    MakeDoubleChecker<double> (-M_PI, M_PI))
     .AddAttribute ("DowntiltAngle",
                    "The downtilt angle in radians",
                    DoubleValue (0.0),
-                   MakeDoubleAccessor (&UniformPlanarArray::m_beta),
+                   MakeDoubleAccessor (&UniformPlanarArray::SetBeta),
+                   MakeDoubleChecker<double> (-M_PI, M_PI))
+    .AddAttribute ("PolSlantAngle",
+                   "The polarization slant angle in radians",
+                   DoubleValue (0.0),
+                   MakeDoubleAccessor (&UniformPlanarArray::SetPolSlant),
                    MakeDoubleChecker<double> (-M_PI, M_PI))
   ;
   return tid;
@@ -127,6 +126,29 @@
   return m_numRows;
 }
 
+void
+UniformPlanarArray::SetAlpha (double alpha)
+{
+  m_alpha = alpha;
+  m_cosAlpha = cos (m_alpha);
+  m_sinAlpha = sin (m_alpha);
+}
+
+void
+UniformPlanarArray::SetBeta (double beta)
+{
+  m_beta = beta;
+  m_cosBeta = cos (m_beta);
+  m_sinBeta = sin (m_beta);
+}
+
+void
+UniformPlanarArray::SetPolSlant (double polSlant)
+{
+  m_polSlant = polSlant;
+  m_cosPolSlant = cos (m_polSlant);
+  m_sinPolSlant = sin (m_polSlant);
+}
 
 void
 UniformPlanarArray::SetAntennaHorizontalSpacing (double s)
@@ -177,27 +199,32 @@
 
   // 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 ())));
+  double cosIncl = cos (a.GetInclination ());
+  double sinIncl = sin (a.GetInclination ());
+  double cosAzim = cos (a.GetAzimuth () - m_alpha);
+  double sinAzim = sin (a.GetAzimuth () - m_alpha);
+  double thetaPrime = std::acos (m_cosBeta * cosIncl + m_sinBeta * cosAzim * sinIncl);
+  double phiPrime = std::arg (std::complex<double> (m_cosBeta * sinIncl * cosAzim - m_sinBeta * cosIncl, sinAzim * sinIncl));
   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
+  // compute the antenna element field patterns using eq. 7.3-4 and 7.3-5 in 3GPP TR 38.901,
+  // using the configured polarization slant angle (m_polSlant)
+  // NOTE: the slant angle (assumed to be 0) differs from the polarization slant angle
+  // (m_polSlant, given by the attribute), in 3GPP TR 38.901
   double aPrimeDb = m_antennaElement->GetGainDb (aPrime);
-  double fieldThetaPrime = pow (10, aPrimeDb / 20); // convert to linear magnitude
+  double fieldThetaPrime = pow (10, aPrimeDb / 20) * m_cosPolSlant; // convert to linear magnitude
+  double fieldPhiPrime = pow (10, aPrimeDb / 20) * m_sinPolSlant; // 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)));
+  double psi = std::arg (std::complex<double> (m_cosBeta * sinIncl - m_sinBeta * cosIncl * cosAzim, m_sinBeta * sinAzim));
   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;
+  double fieldTheta = cos (psi) * fieldThetaPrime - sin (psi) * fieldPhiPrime;
+  double fieldPhi = sin (psi) * fieldThetaPrime + cos (psi) * fieldPhiPrime;
   NS_LOG_DEBUG (RadiansToDegrees (a.GetAzimuth ()) << " " << RadiansToDegrees (a.GetInclination ()) << " " << fieldTheta * fieldTheta + fieldPhi * fieldPhi);
 
   return std::make_pair (fieldPhi, fieldTheta);
@@ -218,9 +245,9 @@
   // 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;
+  loc.x = m_cosAlpha * m_cosBeta * xPrime - m_sinAlpha * yPrime + m_cosAlpha * m_sinBeta * zPrime;
+  loc.y = m_sinAlpha * m_cosBeta * xPrime + m_cosAlpha * yPrime + m_sinAlpha * m_sinBeta * zPrime;
+  loc.z = -m_sinBeta * xPrime + m_cosBeta * zPrime;
   return loc;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/antenna/model/uniform-planar-array.h ns-3.35/src/antenna/model/uniform-planar-array.h
--- ns-3.34/src/antenna/model/uniform-planar-array.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/antenna/model/uniform-planar-array.h	2021-10-01 13:26:47.000000000 -0700
@@ -33,7 +33,7 @@
  * \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.
+ * composed of a single panel and with single (configured) polarization.
  */
 class UniformPlanarArray : public PhasedArrayModel
 {
@@ -49,14 +49,16 @@
    */
   virtual ~UniformPlanarArray (void);
 
-
-  // inherited from Object
+  /**
+   * \brief Get the type ID.
+   * \return The object TypeId.
+   */
   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.
+   * pattern at the specified direction. Single 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
@@ -119,6 +121,29 @@
    */
   uint32_t GetNumRows (void) const;
 
+  /**
+   * \brief Set the bearing angle
+   * This method sets the bearing angle and
+   * computes its cosine and sine
+   * \param alpha the bearing angle in radians
+   */
+  void SetAlpha (double alpha);
+
+  /**
+   * \brief Set the downtilt angle
+   * This method sets the downtilt angle and
+   * computes its cosine and sine
+   * \param beta the downtilt angle in radians
+   */
+  void SetBeta (double beta);
+
+  /**
+   * \brief Set the polarization slant angle
+   * This method sets the polarization slant angle and
+   * computes its cosine and sine
+   * \param polSlant the polarization slant angle in radians
+   */
+  void SetPolSlant (double polSlant);
 
   /**
    * Set the horizontal spacing for the antenna elements of the phased array
@@ -151,14 +176,19 @@
    */
   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
-
+  uint32_t m_numColumns {1}; //!< number of columns
+  uint32_t m_numRows {1}; //!< number of rows
+  double m_disV {0.5}; //!< antenna spacing in the vertical direction in multiples of wave length
+  double m_disH {0.5}; //!< antenna spacing in the horizontal direction in multiples of wave length
+  double m_alpha {0.0}; //!< the bearing angle in radians
+  double m_cosAlpha {1.0}; //!< the cosine of alpha
+  double m_sinAlpha {0.0}; //!< the sine of alpha
+  double m_beta {0.0}; //!< the downtilt angle in radians
+  double m_cosBeta {1.0}; //!< the cosine of Beta
+  double m_sinBeta {0.0}; //!< the sine of Beta
+  double m_polSlant {0.0}; //!< the polarization slant angle in radians
+  double m_cosPolSlant {1.0}; //!< the cosine of polarization slant angle
+  double m_sinPolSlant {0.0}; //!< the sine polarization slant angle
 };
 
 } /* namespace ns3 */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/aodv/bindings/modulegen__gcc_ILP32.py ns-3.35/src/aodv/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/aodv/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/aodv/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1711,11 +1711,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1788,6 +1783,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1808,11 +1808,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1881,11 +1890,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2059,11 +2063,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2256,11 +2255,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/aodv/bindings/modulegen__gcc_LP64.py ns-3.35/src/aodv/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/aodv/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/aodv/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1711,11 +1711,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1788,6 +1783,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1808,11 +1808,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1881,11 +1890,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2059,11 +2063,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2256,11 +2255,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/aodv/test/aodv-regression.cc ns-3.35/src/aodv/test/aodv-regression.cc
--- ns-3.34/src/aodv/test/aodv-regression.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/aodv/test/aodv-regression.cc	2021-10-01 13:26:47.000000000 -0700
@@ -165,6 +165,7 @@
   WifiMacHelper wifiMac;
   wifiMac.SetType ("ns3::AdhocWifiMac");
   YansWifiPhyHelper wifiPhy;
+  wifiPhy.DisablePreambleDetectionModel ();
   YansWifiChannelHelper wifiChannel = YansWifiChannelHelper::Default ();
   Ptr<YansWifiChannel> chan = wifiChannel.Create ();
   wifiPhy.SetChannel (chan);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/applications/bindings/modulegen__gcc_ILP32.py ns-3.35/src/applications/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/applications/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/applications/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -2591,11 +2591,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2700,11 +2695,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2821,11 +2811,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -3018,11 +3003,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/applications/bindings/modulegen__gcc_LP64.py ns-3.35/src/applications/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/applications/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/applications/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -2591,11 +2591,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2700,11 +2695,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2821,11 +2811,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -3018,11 +3003,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/applications/model/packet-sink.cc ns-3.35/src/applications/model/packet-sink.cc
--- ns-3.34/src/applications/model/packet-sink.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/applications/model/packet-sink.cc	2021-10-01 13:26:47.000000000 -0700
@@ -32,6 +32,8 @@
 #include "ns3/udp-socket-factory.h"
 #include "packet-sink.h"
 #include "ns3/boolean.h"
+#include "ns3/ipv4-packet-info-tag.h"
+#include "ns3/ipv6-packet-info-tag.h"
 
 namespace ns3 {
 
@@ -148,7 +150,20 @@
         }
     }
 
+  if (InetSocketAddress::IsMatchingType (m_local))
+    {
+      m_localPort = InetSocketAddress::ConvertFrom (m_local).GetPort ();
+    }
+  else if (Inet6SocketAddress::IsMatchingType (m_local))
+    {
+      m_localPort = Inet6SocketAddress::ConvertFrom (m_local).GetPort ();
+    }
+  else
+    {
+      m_localPort = 0;
+    }
   m_socket->SetRecvCallback (MakeCallback (&PacketSink::HandleRead, this));
+  m_socket->SetRecvPktInfo (true);
   m_socket->SetAcceptCallback (
     MakeNullCallback<bool, Ptr<Socket>, const Address &> (),
     MakeCallback (&PacketSink::HandleAccept, this));
@@ -204,13 +219,31 @@
                        << " port " << Inet6SocketAddress::ConvertFrom (from).GetPort ()
                        << " total Rx " << m_totalRx << " bytes");
         }
-      socket->GetSockName (localAddress);
-      m_rxTrace (packet, from);
-      m_rxTraceWithAddresses (packet, from, localAddress);
 
-      if (m_enableSeqTsSizeHeader)
+      if (!m_rxTrace.IsEmpty () || !m_rxTraceWithAddresses.IsEmpty () ||
+          (!m_rxTraceWithSeqTsSize.IsEmpty () && m_enableSeqTsSizeHeader))
         {
-          PacketReceived (packet, from, localAddress);
+          Ipv4PacketInfoTag interfaceInfo;
+          Ipv6PacketInfoTag interface6Info;
+          if (packet->RemovePacketTag (interfaceInfo))
+            {
+              localAddress = InetSocketAddress (interfaceInfo.GetAddress (), m_localPort);
+            }
+          else if (packet->RemovePacketTag (interface6Info))
+            {
+              localAddress = Inet6SocketAddress (interface6Info.GetAddress (), m_localPort);
+            }
+          else
+            {
+              socket->GetSockName (localAddress);
+            }
+          m_rxTrace (packet, from);
+          m_rxTraceWithAddresses (packet, from, localAddress);
+
+          if (!m_rxTraceWithSeqTsSize.IsEmpty () && m_enableSeqTsSizeHeader)
+            {
+              PacketReceived (packet, from, localAddress);
+            }
         }
     }
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/applications/model/packet-sink.h ns-3.35/src/applications/model/packet-sink.h
--- ns-3.34/src/applications/model/packet-sink.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/applications/model/packet-sink.h	2021-10-01 13:26:47.000000000 -0700
@@ -176,7 +176,8 @@
   Ptr<Socket>     m_socket;       //!< Listening socket
   std::list<Ptr<Socket> > m_socketList; //!< the accepted sockets
 
-  Address         m_local;        //!< Local address to bind to
+  Address         m_local;        //!< Local address to bind to (address and port)
+  uint16_t        m_localPort;    //!< Local port to bind to
   uint64_t        m_totalRx;      //!< Total bytes received
   TypeId          m_tid;          //!< Protocol TypeId
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/applications/model/udp-client.cc ns-3.35/src/applications/model/udp-client.cc
--- ns-3.34/src/applications/model/udp-client.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/applications/model/udp-client.cc	2021-10-01 13:26:47.000000000 -0700
@@ -156,6 +156,27 @@
         }
     }
 
+#ifdef NS3_LOG_ENABLE
+  std::stringstream peerAddressStringStream;
+  if (Ipv4Address::IsMatchingType (m_peerAddress))
+    {
+      peerAddressStringStream << Ipv4Address::ConvertFrom (m_peerAddress);
+    }
+  else if (Ipv6Address::IsMatchingType (m_peerAddress))
+    {
+      peerAddressStringStream << Ipv6Address::ConvertFrom (m_peerAddress);
+    }
+  else if (InetSocketAddress::IsMatchingType (m_peerAddress))
+    {
+      peerAddressStringStream << InetSocketAddress::ConvertFrom (m_peerAddress).GetIpv4 ();
+    }
+  else if (Inet6SocketAddress::IsMatchingType (m_peerAddress))
+    {
+      peerAddressStringStream << Inet6SocketAddress::ConvertFrom (m_peerAddress).GetIpv6 ();
+    }
+  m_peerAddressString = peerAddressStringStream.str();
+#endif // NS3_LOG_ENABLE
+
   m_socket->SetRecvCallback (MakeNullCallback<void, Ptr<Socket> > ());
   m_socket->SetAllowBroadcast (true);
   m_sendEvent = Simulator::Schedule (Seconds (0.0), &UdpClient::Send, this);
@@ -178,31 +199,24 @@
   Ptr<Packet> p = Create<Packet> (m_size-(8+4)); // 8+4 : the size of the seqTs header
   p->AddHeader (seqTs);
 
-  std::stringstream peerAddressStringStream;
-  if (Ipv4Address::IsMatchingType (m_peerAddress))
-    {
-      peerAddressStringStream << Ipv4Address::ConvertFrom (m_peerAddress);
-    }
-  else if (Ipv6Address::IsMatchingType (m_peerAddress))
-    {
-      peerAddressStringStream << Ipv6Address::ConvertFrom (m_peerAddress);
-    }
-
   if ((m_socket->Send (p)) >= 0)
     {
       ++m_sent;
       m_totalTx += p->GetSize ();
-      NS_LOG_INFO ("TraceDelay TX " << m_size << " bytes to "
-                                    << peerAddressStringStream.str () << " Uid: "
+#ifdef NS3_LOG_ENABLE
+    NS_LOG_INFO ("TraceDelay TX " << m_size << " bytes to "
+                                    << m_peerAddressString << " Uid: "
                                     << p->GetUid () << " Time: "
                                     << (Simulator::Now ()).As (Time::S));
-
+#endif // NS3_LOG_ENABLE
     }
+#ifdef NS3_LOG_ENABLE
   else
     {
       NS_LOG_INFO ("Error while sending " << m_size << " bytes to "
-                                          << peerAddressStringStream.str ());
+                                          << m_peerAddressString);
     }
+#endif // NS3_LOG_ENABLE
 
   if (m_sent < m_count)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/applications/model/udp-client.h ns-3.35/src/applications/model/udp-client.h
--- ns-3.34/src/applications/model/udp-client.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/applications/model/udp-client.h	2021-10-01 13:26:47.000000000 -0700
@@ -93,7 +93,9 @@
   Address m_peerAddress; //!< Remote peer address
   uint16_t m_peerPort; //!< Remote peer port
   EventId m_sendEvent; //!< Event to send the next packet
-
+#ifdef NS3_LOG_ENABLE
+  std::string m_peerAddressString; //!< Remote peer address string
+#endif // NS3_LOG_ENABLE
 };
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/bridge/bindings/modulegen__gcc_ILP32.py ns-3.35/src/bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/bridge/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/bridge/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1221,11 +1221,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1330,11 +1325,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1451,11 +1441,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1648,11 +1633,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/bridge/bindings/modulegen__gcc_LP64.py ns-3.35/src/bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/bridge/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/bridge/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1221,11 +1221,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1330,11 +1325,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1451,11 +1441,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1648,11 +1633,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/brite/examples/brite-generic-example.cc ns-3.35/src/brite/examples/brite-generic-example.cc
--- ns-3.34/src/brite/examples/brite-generic-example.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/brite/examples/brite-generic-example.cc	2021-10-01 13:26:47.000000000 -0700
@@ -23,7 +23,7 @@
 #include "ns3/mobility-module.h"
 #include "ns3/applications-module.h"
 #include "ns3/brite-module.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 #include <iostream>
 #include <fstream>
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/brite/examples/brite-MPI-example.cc ns-3.35/src/brite/examples/brite-MPI-example.cc
--- ns-3.34/src/brite/examples/brite-MPI-example.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/brite/examples/brite-MPI-example.cc	2021-10-01 13:26:47.000000000 -0700
@@ -24,7 +24,7 @@
 #include "ns3/mobility-module.h"
 #include "ns3/applications-module.h"
 #include "ns3/brite-module.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/bindings/modulegen__gcc_ILP32.py ns-3.35/src/buildings/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/buildings/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/buildings/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1690,11 +1690,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1799,11 +1794,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1920,11 +1910,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2117,11 +2102,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3282,6 +3262,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -3309,6 +3294,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -5775,6 +5765,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -5809,6 +5804,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/bindings/modulegen__gcc_LP64.py ns-3.35/src/buildings/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/buildings/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/buildings/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1690,11 +1690,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1799,11 +1794,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1920,11 +1910,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2117,11 +2102,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3282,6 +3262,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -3309,6 +3294,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -5775,6 +5765,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -5809,6 +5804,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/doc/source/buildings-user.rst ns-3.35/src/buildings/doc/source/buildings-user.rst
--- ns-3.34/src/buildings/doc/source/buildings-user.rst	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/buildings/doc/source/buildings-user.rst	2021-10-01 13:26:47.000000000 -0700
@@ -86,6 +86,26 @@
 presence of buildings might easily results in node moving in and out
 of buildings, regardless of the presence of walls.
 
+One dedicated buildings-aware mobility model is the
+``RandomWalk2dOutdoorMobilityModel``.  This class is similar to the
+``RandomWalk2dMobilityModel`` but avoids placing the trajectory
+on a path that would intersect a building wall.  If a boundary
+is encountered (either the bounding box or a building wall), the
+model rebounds with a random direction and speed that ensures that
+the trajectory stays outside the buildings.  An example program
+that demonstrates the use of this model is the
+``src/buildings/examples/outdoor-random-walk-example.cc`` which
+has an associated shell script to plot the traces generated.
+Another example program demonstrates how this outdoor mobility
+model can be used as the basis of a group mobility model, with
+the outdoor buildings-aware model serving as the parent or
+reference mobility model, and with additional nodes defining a
+child mobility model providing the offset from the reference
+mobility model.  This example,
+``src/buildings/example/outdoor-group-mobility-example.cc``,
+also has an associated shell script
+(``outdoor-group-mobility-animate.sh``) that can be used to generate
+an animated GIF of the group's movement.
 
 Place some nodes
 ****************
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/examples/outdoor-group-mobility-animate.sh ns-3.35/src/buildings/examples/outdoor-group-mobility-animate.sh
--- ns-3.34/src/buildings/examples/outdoor-group-mobility-animate.sh	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/buildings/examples/outdoor-group-mobility-animate.sh	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,91 @@
+#!/bin/bash
+
+# Copyright (c) 2019, University of Padova, Dep. of Information Engineering, SIGNET lab
+# Copyright (c) 2021, University of Washington: animation extensions
+#
+# 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: Michele Polese <michele.polese@gmail.com>
+#          Tom Henderson <tomhend@uw.edu>
+
+#
+#  Plot the trace generated by outdoor-group-mobility-example.cc
+#  in a manner that enables animation
+#
+
+# This Bash script is a variant of
+# src/mobility/examples/reference-point-group-mobility-animate.sh that
+# generates a large number of PNG image files, one for each node position
+# traced in the mobility trace file 'outdoor-group-mobility-time-series.mob'
+#
+# This script relies on gnuplot (version 5.0 or greater).
+#
+# The PNGs are named in increasing numerical order from '0000.png' to
+# '0799.png'.  The images can be assembled into an animated gif file
+# using a tool such as ImageMagick's convert utility, such as:
+#
+# $ convert -delay 10 -loop 0 *.png outdoor-animation.gif
+#
+# and the output file 'outdoor-animation.gif' can be viewed by an image viewer. 
+#
+# Because this file generates many PNG files, it is recommended to move
+# this script, the generated time-series mobility file named 
+# 'outdoor-group-mobility-time-series.mob', and the generated buildings file
+# 'outdoor-group-mobility-buildings.txt' to a subdirectory, and then
+# run:
+# $ ./outdoor-group-mobility-animation.sh
+# $ convert -delay 10 -loop 0 *.png outdoor-animation.gif
+#  
+
+# The script first checks and enforces that only three nodes are present
+num_nodes=`cat outdoor-group-mobility-time-series.mob | awk '{ print $2 }' | sort -n | uniq | wc -l`
+if [ "$num_nodes" -ne "3" ]; then
+    echo "Exiting: this tracing program designed only for 3 nodes"
+    exit 1
+fi
+# reduce the trace
+cat outdoor-group-mobility-time-series.mob | awk -F " " '{ print $3 }' | awk -F ":" '{ print $1" "$2 }' > ogm-time-series.tmp
+# read three lines at a time from the reduced trace, convert to
+# a plottable temporary file, and invoke gnuplot.  Loop until done.
+n=0
+while read p1 && read p2 && read p3; do
+    basename=$(printf "%04d" "$n")
+    cat >plotcmds <<EOL
+# If you do not have pngcairo installed, you can 'set terminal png' below,
+# but it will render the dashed bounding box as a solid line
+set terminal pngcairo dashed
+set output '$basename.png'
+set view map
+set xlabel 'X [m]'
+set ylabel 'Y [m]'
+set xrange [-10:110]
+set yrange [-10:60]
+set style fill transparent solid 0.5
+unset key
+set style fill  transparent solid 0.35 noborder
+set style circle radius 0.5
+# Define dashed lines to mark the outer bounding box
+set arrow from 0,0 to 100,0 nohead dt "-" lc rgb "light-grey"
+set arrow from 100,0 to 100,50 nohead dt "-" lc rgb "light-grey"
+set arrow from 0,50 to 100,50 nohead dt "-" lc rgb "light-grey"
+set arrow from 0,0 to 0,50 nohead dt "-" lc rgb "light-grey"
+plot "<echo '$p1'" with circles lc rgb "red",\
+     "<echo '$p2'" with circles lc rgb "blue",\
+     "<echo '$p3'" with circles lc rgb "black"
+EOL
+    gnuplot outdoor-group-mobility-buildings.txt plotcmds
+    rm plotcmds
+    (( n++ ))
+done < ogm-time-series.tmp
+rm ogm-time-series.tmp
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/examples/outdoor-group-mobility-example.cc ns-3.35/src/buildings/examples/outdoor-group-mobility-example.cc
--- ns-3.34/src/buildings/examples/outdoor-group-mobility-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/buildings/examples/outdoor-group-mobility-example.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,261 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Institute for the Wireless Internet of Things, Northeastern University, Boston, MA
+ * Copyright (c) 2021, University of Washington: refactor for hierarchical model
+ *
+ * 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: Michele Polese <michele.polese@gmail.com>
+ * Heavily edited by Tom Henderson to use HierarchicalMobilityModel
+ */
+
+/**
+ * This example shows how to use the ns3::HierarchicalMobilityModel
+ * to construct a Reference Point Group Mobility model (RPGM) model
+ * as described in "A survey of mobility models for ad hoc network
+ * research" by Tracy Camp, Jeff Boleng, and Vanessa Davies, Wireless
+ * Communications and Mobile Computing, 2002: vol. 2, pp. 2483-502.
+ * This example is closely related to the group mobility example
+ * `src/mobility/group/reference-point-group-mobility-example.cc`
+ * except that this version is buildings-aware.
+ *
+ * The HierarchicalMobilityModel is composed of two mobility models;
+ * a parent and a child.  The position of the child is expressed
+ * in reference to the position of the parent.  For group mobility,
+ * each node in the group can install the same parent mobility model
+ * and different child mobility models.  The parent mobility model
+ * in this case, the "RandomWalk2dOutdoorMobilityModel", is
+ * buildings-aware.  The child mobility models are not, but the
+ * "Tolerance" attribute is defined on the parent model such that the
+ * child mobility models do not result in movement through a building
+ * wall.
+ *
+ * Standard ns-3 mobility model course change output is traced in
+ * outdoor-group-mobility-course-change.mob.  Time series data of position
+ * is traced in outdoor-group-mobility-time-series.mob.  This time series
+ * data can be animated with a corresponding Bash script.  Another program
+ * output is the list of buildings ("outdoor-group-mobility-buildings.txt").
+ *
+ * There is one program option:  'useHelper'.  This is simply for code
+ * demonstration purposes; it selects the branch of code that is used
+ * to either configure the mobility using a helper object, or
+ * to directly configure using CreateObject<> () and handling of pointers.
+ * The traces generated should be the same.
+ *
+ * Randomness in this program is due to the parent mobility model which
+ * executes a random walk, while the child mobility models are set as
+ * constant position offsets from the parent.  Slightly different motion  
+ * can be obtained by changing the ns-3 'RunNumber' value (see the
+ * documentation on ns-3 random variables).
+ */
+
+#include <iostream>
+#include "ns3/core-module.h"
+#include <ns3/mobility-module.h>
+#include "ns3/network-module.h"
+#include "ns3/buildings-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("OutdoorGroupMobilityExample");
+
+std::ofstream g_timeSeries;
+
+void
+PrintPosition (Ptr<Node> node)
+{
+  if (node == nullptr) return;
+  Ptr<MobilityModel> model = node->GetObject<MobilityModel> ();
+  if (model == nullptr) return;
+  NS_LOG_LOGIC ("Node: " << node->GetId () << " Position: " << model->GetPosition ());
+  g_timeSeries << Simulator::Now ().GetSeconds () << " " << node->GetId () << " " << model->GetPosition () << std::endl;
+  
+}
+
+void
+PrintGnuplottableBuildingListToFile (std::string filename)
+{
+  std::ofstream outFile;
+  outFile.open (filename.c_str (), std::ios_base::out | std::ios_base::trunc);
+  if (!outFile.is_open ())
+    {
+      NS_LOG_ERROR ("Can't open file " << filename);
+      return;
+    }
+  uint32_t index = 1;
+  for (BuildingList::Iterator it = BuildingList::Begin (); it != BuildingList::End (); ++it)
+    {
+      ++index;
+      Box box = (*it)->GetBoundaries ();
+      outFile << "set object " << index
+              << " rect from " << box.xMin  << "," << box.yMin
+              << " to "   << box.xMax  << "," << box.yMax
+              << std::endl;
+    }
+}
+
+int
+main (int argc, char *argv[])
+{
+  Time simTime = Seconds (800);
+  uint32_t numPrints = 800;
+  bool useHelper = false;
+
+  CommandLine cmd (__FILE__);
+  cmd.AddValue ("useHelper", "Whether to use helper code", useHelper);
+  cmd.Parse (argc, argv);
+
+  g_timeSeries.open ("outdoor-group-mobility-time-series.mob");
+  
+  NodeContainer n;
+  n.Create (3);
+
+  // The primary mobility model is the RandomWalk2dOutdoorMobilityModel
+  // defined within this bounding box (along with four buildings, not shown):
+  //
+  // (0,50)                   (100,50)
+  //   +-------------------------+
+  //   |                         |
+  //   |                         |
+  //   |                         |
+  //   |                         |
+  //   |                         |
+  //   +-------------------------+
+  // (0,0)                     (100,0)
+  //
+  //
+  // There are two buildings centered at (50,10) and (50,40), and two
+  // additional small buildings centered at (20,25) and (80,25) that
+  // create obstacles for the nodes to avoid.
+
+  std::vector<Ptr<Building> > buildingVector;
+  Ptr<Building> building = CreateObject<Building> ();
+  building->SetBoundaries (Box (45, 55, 5, 15, 0, 10));
+  buildingVector.push_back (building);
+  building = CreateObject<Building> ();
+  building->SetBoundaries (Box (45, 55, 35, 45, 0, 10));
+  buildingVector.push_back (building);
+  building = CreateObject<Building> ();
+  building->SetBoundaries (Box (17.5, 22.5, 22.5, 27.5, 0, 10));
+  buildingVector.push_back (building);
+  building = CreateObject<Building> ();
+  building->SetBoundaries (Box (77.5, 82.5, 22.5, 27.5, 0, 10));
+  buildingVector.push_back (building);
+
+  // print the list of buildings to file
+  PrintGnuplottableBuildingListToFile ("outdoor-group-mobility-buildings.txt");
+
+  // The program now branches into two:  one using the low-level API, and
+  // one using the GroupMobilityHelper.  Both branches result in equivalent
+  // configuration.
+
+  int64_t streamIndex = 1;
+  if (useHelper == false)
+    {
+      // The reference (parent) mobility model starts at coordinate (10, 10, 0)
+      // and performs a buildings-aware random walk.
+      //
+      Ptr<RandomWalk2dOutdoorMobilityModel> outdoorMm = CreateObject<RandomWalk2dOutdoorMobilityModel> ();
+      outdoorMm->SetAttribute ("Bounds", RectangleValue (Rectangle (0, 100, 0, 50)));
+      // The tolerance value is used to prevent the child mobility models from
+      // crossing building walls.  The child mobility models are defined as
+      // offsets from the parent but are not buildings-aware, so it could be
+      // the case that the parent mobility model was just outside of a wall
+      // but the child mobility model was inside of a wall.  The tolerance
+      // value (in meters) prevents the composite position from passing
+      // through a building wall.
+      outdoorMm->SetAttribute ("Tolerance", DoubleValue (2));
+      // The initial position can be directly set
+      outdoorMm->SetPosition (Vector (10, 10, 0));
+      streamIndex += outdoorMm->AssignStreams (streamIndex);
+
+      // Each HierachicalMobilityModel contains the above model as the Parent,
+      // and a user defined model as the Child.  Two MobilityModel objects are
+      // instantiated per node, and each node also shares the same parent model.
+
+      // Mobility model for the first node (node 0)
+      Ptr<HierarchicalMobilityModel> hierarchical0 = CreateObject<HierarchicalMobilityModel> ();
+      hierarchical0->SetParent (outdoorMm);
+
+      // Child model for the first node (node 0)
+      Ptr<ConstantPositionMobilityModel> child0 = CreateObject<ConstantPositionMobilityModel> ();
+      child0->SetPosition (Vector (1, 0, 0)); // 1 m offset from parent position
+      // There is no need to AssignStreams() to child0 because the position
+      // is constant and deterministic
+      hierarchical0->SetChild (child0);
+      n.Get (0)->AggregateObject (hierarchical0);
+
+      // Repeat for other two nodes
+      Ptr<HierarchicalMobilityModel> hierarchical1 = CreateObject<HierarchicalMobilityModel> ();
+      hierarchical1->SetParent (outdoorMm); // Same parent as before
+      Ptr<ConstantPositionMobilityModel> child1 = CreateObject<ConstantPositionMobilityModel> ();
+      child1->SetPosition (Vector (-1, 0, 0));
+      hierarchical1->SetChild (child1);
+      n.Get (1)->AggregateObject (hierarchical1);
+      Ptr<HierarchicalMobilityModel> hierarchical2 = CreateObject<HierarchicalMobilityModel> ();
+      hierarchical2->SetParent (outdoorMm); // Same parent as before
+      Ptr<ConstantPositionMobilityModel> child2 = CreateObject<ConstantPositionMobilityModel> ();
+      child2->SetPosition (Vector (0, 1, 0));
+      hierarchical2->SetChild (child2);
+      n.Get (2)->AggregateObject (hierarchical2);
+    } 
+  else
+    { 
+      // This branch demonstrates an equivalent set of commands but using
+      // the GroupMobilityHelper
+      GroupMobilityHelper group;
+
+      // The helper provides a method to set the reference mobility model
+      // for construction by an object factory, but in this case, since we
+      // are using the WaypointMobilityModel, which requires us to add
+      // waypoints directly on the object, we will just pass in the pointer.
+      group.SetReferenceMobilityModel ("ns3::RandomWalk2dOutdoorMobilityModel", 
+        "Bounds", RectangleValue (Rectangle (0, 100, 0, 50)),
+        "Tolerance", DoubleValue (2));
+      Ptr<ListPositionAllocator> listPosition = CreateObject<ListPositionAllocator> ();
+      listPosition->Add (Vector (10, 10, 0));
+      group.SetReferencePositionAllocator (listPosition);
+    
+      group.SetMemberMobilityModel ("ns3::ConstantPositionMobilityModel");
+      listPosition = CreateObject<ListPositionAllocator> ();
+      listPosition->Add (Vector (1, 0, 0)); // first child
+      listPosition->Add (Vector (-1, 0, 0)); // second child
+      listPosition->Add (Vector (0, 1, 0)); // second child
+      group.SetMemberPositionAllocator (listPosition);
+     
+      // Install to all three nodes
+      group.Install (n);
+
+      // After installation, use the helper to make the equivalent
+      // stream assignments as above
+      group.AssignStreams (n, streamIndex);
+    }
+
+  AsciiTraceHelper ascii;
+  MobilityHelper::EnableAsciiAll (ascii.CreateFileStream ("outdoor-group-mobility-course-change.mob"));
+
+  // Use a logging PrintPosition() to record time-series position
+  for (unsigned int i = 0; i < numPrints; i++)
+    {
+      for (auto nodeIt = n.Begin (); nodeIt != n.End (); ++nodeIt)
+        {
+          Simulator::Schedule (NanoSeconds (i * simTime.GetNanoSeconds () / numPrints), &PrintPosition, (*nodeIt));
+        }
+    }
+
+  Simulator::Stop (simTime);
+  Simulator::Run ();
+  g_timeSeries.close ();
+  Simulator::Destroy ();
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/examples/outdoor-random-walk-example-animate.sh ns-3.35/src/buildings/examples/outdoor-random-walk-example-animate.sh
--- ns-3.34/src/buildings/examples/outdoor-random-walk-example-animate.sh	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/buildings/examples/outdoor-random-walk-example-animate.sh	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,69 @@
+#!/bin/bash
+
+# Copyright (c) 2019, University of Padova, Dep. of Information Engineering, SIGNET lab
+# Copyright (c) 2021, University of Washington: animation extensions
+#
+# 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: Michele Polese <michele.polese@gmail.com>
+#          Tom Henderson <tomhend@uw.edu> (animation extensions)
+
+#
+#  Plot the trace generated by outdoor-random-walk-example.cc
+#  in a manner that enables animation
+#
+
+# This Bash script is a variant of outdoor-random-walk-example.sh that
+# generates a large number of PNG image files, one for each node position
+# traced in the mobility trace file 'mobility-trace-example.mob'
+#
+# To run this script, ensure that 'mobility-trace-example.mob' and
+# 'buildings.txt' file are present in the same directory.  The script
+# will create a subdirectory named 'outdoor-random-walk-animation' and
+# will generate 820 PNG files into that subdirectory.
+# 
+# The PNGs are named in increasing numerical order from '0000.png' to
+# '0819.png'.  The images can be assembled into an animated gif file
+# using a tool such as ImageMagick's convert utility, such as:
+#
+# $ convert -delay 100 -loop 0 *.png outdoor-random-walk-animation.gif
+#
+# For a similar script that produces a single EPS file of all locations
+# traced, see 'outdoor-random-walk-example.sh'.
+
+mkdir -p outdoor-random-walk-animation
+cat mobility-trace-example.mob | awk -F " " '{ print $3 }' | awk -F "=" '{ print $2 }' | awk -F ":" '{ print $1" "$2 }' > mobility-trace-reduced.txt
+n=0
+while read p; do
+    basename=$(printf "%04d" "$n")
+    cat >plotcmds <<EOL
+set terminal png
+set output '$basename.png'
+set view map
+set xlabel 'X [m]'
+set ylabel 'Y [m]'
+set xrange [-25:1300]
+set yrange [-25:800]
+set style fill transparent solid 0.5
+unset key
+set style fill  transparent solid 0.35 noborder
+set style circle radius 5
+plot "<echo '$p'" with circles lc rgb "blue"
+EOL
+    gnuplot buildings.txt plotcmds
+    rm plotcmds 
+    mv $basename.png outdoor-random-walk-animation
+    (( n++ ))
+done < mobility-trace-reduced.txt
+rm mobility-trace-reduced.txt
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/examples/wscript ns-3.35/src/buildings/examples/wscript
--- ns-3.34/src/buildings/examples/wscript	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/buildings/examples/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -7,3 +7,6 @@
     obj = bld.create_ns3_program('outdoor-random-walk-example',
                                  ['buildings'])
     obj.source = 'outdoor-random-walk-example.cc'
+    obj = bld.create_ns3_program('outdoor-group-mobility-example',
+                                 ['mobility', 'network', 'buildings'])
+    obj.source = 'outdoor-group-mobility-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/buildings/test/examples-to-run.py ns-3.35/src/buildings/test/examples-to-run.py
--- ns-3.34/src/buildings/test/examples-to-run.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/buildings/test/examples-to-run.py	2021-10-01 13:26:47.000000000 -0700
@@ -10,6 +10,8 @@
 # See test.py for more information.
 cpp_examples = [
     ("buildings-pathloss-profiler", "True", "True"),
+    ("outdoor-group-mobility-example --useHelper=0", "True", "True"),
+    ("outdoor-group-mobility-example --useHelper=1", "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.34/src/click/bindings/modulegen__gcc_ILP32.py ns-3.35/src/click/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/click/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/click/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1396,11 +1396,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1473,6 +1468,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1493,11 +1493,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1566,11 +1575,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1687,11 +1691,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1884,11 +1883,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/click/bindings/modulegen__gcc_LP64.py ns-3.35/src/click/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/click/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/click/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1396,11 +1396,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1473,6 +1468,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1493,11 +1493,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1566,11 +1575,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1687,11 +1691,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1884,11 +1883,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/bindings/modulegen__gcc_ILP32.py ns-3.35/src/config-store/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/config-store/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -38,8 +38,6 @@
     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]
@@ -175,7 +173,6 @@
     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'])
@@ -324,21 +321,10 @@
                    'void', 
                    [param('std::string', 'filename')], 
                    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', 
+    ## file-config.h (module 'config-store'): void ns3::FileConfig::SetSaveDeprecated(bool saveDeprecated) [member function]
+    cls.add_method('SetSaveDeprecated', 
                    'void', 
-                   [])
-    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureDefaults() [member function]
-    cls.add_method('ConfigureDefaults', 
-                   'void', 
-                   [])
+                   [param('bool', 'saveDeprecated')])
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -768,6 +754,10 @@
     cls.add_method('SetMode', 
                    'void', 
                    [param('ns3::ConfigStore::Mode', 'mode')])
+    ## config-store.h (module 'config-store'): void ns3::ConfigStore::SetSaveDeprecated(bool saveDeprecated) [member function]
+    cls.add_method('SetSaveDeprecated', 
+                   'void', 
+                   [param('bool', 'saveDeprecated')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/bindings/modulegen__gcc_LP64.py ns-3.35/src/config-store/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/config-store/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -38,8 +38,6 @@
     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]
@@ -175,7 +173,6 @@
     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'])
@@ -324,21 +321,10 @@
                    'void', 
                    [param('std::string', 'filename')], 
                    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', 
+    ## file-config.h (module 'config-store'): void ns3::FileConfig::SetSaveDeprecated(bool saveDeprecated) [member function]
+    cls.add_method('SetSaveDeprecated', 
                    'void', 
-                   [])
-    ## gtk-config-store.h (module 'config-store'): void ns3::GtkConfigStore::ConfigureDefaults() [member function]
-    cls.add_method('ConfigureDefaults', 
-                   'void', 
-                   [])
+                   [param('bool', 'saveDeprecated')])
     return
 
 def register_Ns3Hasher_methods(root_module, cls):
@@ -768,6 +754,10 @@
     cls.add_method('SetMode', 
                    'void', 
                    [param('ns3::ConfigStore::Mode', 'mode')])
+    ## config-store.h (module 'config-store'): void ns3::ConfigStore::SetSaveDeprecated(bool saveDeprecated) [member function]
+    cls.add_method('SetSaveDeprecated', 
+                   'void', 
+                   [param('bool', 'saveDeprecated')])
     return
 
 def register_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/model/config-store.cc ns-3.35/src/config-store/model/config-store.cc
--- ns-3.34/src/config-store/model/config-store.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/model/config-store.cc	2021-10-01 13:26:47.000000000 -0700
@@ -26,6 +26,7 @@
 #include "ns3/simulator.h"
 #include "ns3/attribute-construction-list.h"
 #include "ns3/enum.h"
+#include "ns3/boolean.h"
 #include "ns3/config-store-config.h"
 #ifdef HAVE_LIBXML2
 #include "xml-config.h"
@@ -68,6 +69,11 @@
                    MakeEnumAccessor (&ConfigStore::SetFileFormat),
                    MakeEnumChecker (ConfigStore::RAW_TEXT, "RawText",
                                     ConfigStore::XML, "Xml"))
+    .AddAttribute ("SaveDeprecated",
+                   "Save DEPRECATED attributes",
+                   BooleanValue (true),
+                   MakeBooleanAccessor (&ConfigStore::SetSaveDeprecated),
+                   MakeBooleanChecker ())
   ;
   return tid;
 }
@@ -129,6 +135,8 @@
         }
     }
   m_file->SetFilename (m_filename);
+  m_file->SetSaveDeprecated (m_saveDeprecated);
+
   NS_LOG_FUNCTION (this << ": format: " << m_fileFormat
                 << ", mode: " << m_mode
                 << ", file name: " << m_filename);
@@ -159,6 +167,12 @@
   NS_LOG_FUNCTION (this << filename);
   m_filename = filename;
 }
+void
+ConfigStore::SetSaveDeprecated (bool saveDeprecated)
+{
+  NS_LOG_FUNCTION (this << saveDeprecated);
+  m_saveDeprecated = saveDeprecated;
+}
 
 void 
 ConfigStore::ConfigureAttributes (void)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/model/config-store.h ns-3.35/src/config-store/model/config-store.h
--- ns-3.34/src/config-store/model/config-store.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/model/config-store.h	2021-10-01 13:26:47.000000000 -0700
@@ -103,6 +103,11 @@
    * \param filename the file name
    */
   void SetFilename (std::string filename);
+  /**
+   * Set if to save deprecated attributes
+   * \param saveDeprecated the deprecated attributes save policy
+   */
+  void SetSaveDeprecated (bool saveDeprecated);
 
   /**
    * Configure the default values
@@ -116,6 +121,7 @@
 private:
   enum Mode m_mode; ///< store mode
   enum FileFormat m_fileFormat; ///< store format
+  bool m_saveDeprecated; ///< save deprecated attributes
   std::string m_filename; ///< store file name
   FileConfig *m_file; ///< configuration file
 };
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/model/file-config.cc ns-3.35/src/config-store/model/file-config.cc
--- ns-3.34/src/config-store/model/file-config.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/model/file-config.cc	2021-10-01 13:26:47.000000000 -0700
@@ -26,6 +26,12 @@
 {
 }
 
+void
+FileConfig::SetSaveDeprecated (bool saveDeprecated)
+{
+  m_saveDeprecated = saveDeprecated;
+}
+
 NoneFileConfig::NoneFileConfig ()
 {
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/model/file-config.h ns-3.35/src/config-store/model/file-config.h
--- ns-3.34/src/config-store/model/file-config.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/model/file-config.h	2021-10-01 13:26:47.000000000 -0700
@@ -40,6 +40,11 @@
    */
   virtual void SetFilename (std::string filename) = 0;
   /**
+   * Set if to save deprecated attributes
+   * \param saveDeprecated the deprecated attributes save policy
+   */
+  void SetSaveDeprecated (bool saveDeprecated);
+  /**
    * Load or save the default values
    */
   virtual void Default (void) = 0;
@@ -51,6 +56,9 @@
    * Load or save the attributes values
    */
   virtual void Attributes (void) = 0;
+
+protected:
+  bool m_saveDeprecated; ///< save deprecated attributes
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/model/raw-text-config.cc ns-3.35/src/config-store/model/raw-text-config.cc
--- ns-3.34/src/config-store/model/raw-text-config.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/model/raw-text-config.cc	2021-10-01 13:26:47.000000000 -0700
@@ -67,19 +67,51 @@
     RawTextDefaultIterator (std::ostream *os) {
       m_os = os;
     }
+    void SetSaveDeprecated (bool saveDeprecated) {
+      m_saveDeprecated = saveDeprecated;
+    }
+
 private:
     virtual void StartVisitTypeId (std::string name) {
       m_typeId = name;
     }
     virtual void DoVisitAttribute (std::string name, std::string defaultValue) {
       NS_LOG_DEBUG ("Saving " << m_typeId << "::" << name);
-      *m_os << "default " << m_typeId << "::" << name << " \"" << defaultValue << "\"" << std::endl;
-    }
+      TypeId tid = TypeId::LookupByName (m_typeId);
+      ns3::TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED;
+      for (std::size_t i = 0; i < tid.GetAttributeN (); i++)
+        {
+          struct TypeId::AttributeInformation tmp = tid.GetAttribute (i);
+          if (tmp.name == name)
+            {
+              supportLevel = tmp.supportLevel;
+              break;
+            }
+        }
+      if (supportLevel == TypeId::SupportLevel::OBSOLETE)
+        {
+          NS_LOG_WARN ("Global attribute "
+                       << m_typeId << "::" << name
+                       << " was not saved because it is OBSOLETE");
+        }
+      else if ((supportLevel == TypeId::SupportLevel::DEPRECATED) && (m_saveDeprecated == false))
+        {
+          NS_LOG_WARN ("Global attribute " << m_typeId << "::" << name
+                                           << " was not saved because it is DEPRECATED");
+        }
+      else
+        {
+          *m_os << "default " << m_typeId << "::" << name << " \"" << defaultValue << "\""
+                << std::endl;
+        }
+      }
     std::string m_typeId;
     std::ostream *m_os;
+    bool m_saveDeprecated;
   };
 
   RawTextDefaultIterator iterator = RawTextDefaultIterator (m_os);
+  iterator.SetSaveDeprecated (m_saveDeprecated);
   iterator.Iterate ();
 }
 void
@@ -103,17 +135,50 @@
 public:
     RawTextAttributeIterator (std::ostream *os)
       : m_os (os) {}
+    void
+    SetSaveDeprecated (bool saveDeprecated) {
+      m_saveDeprecated = saveDeprecated;
+    }
+
 private:
     virtual void DoVisitAttribute (Ptr<Object> object, std::string name) {
       StringValue str;
-      object->GetAttribute (name, str);
-      NS_LOG_DEBUG ("Saving " << GetCurrentPath ());
-      *m_os << "value " << GetCurrentPath () << " \"" << str.Get () << "\"" << std::endl;
+
+      ns3::TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED;
+      TypeId tid = object->GetInstanceTypeId ();
+
+      for (std::size_t i = 0; i < tid.GetAttributeN (); i++)
+        {
+          struct TypeId::AttributeInformation tmp = tid.GetAttribute (i);
+          if (tmp.name == name)
+            {
+              supportLevel = tmp.supportLevel;
+              break;
+            }
+        }
+      if (supportLevel == TypeId::SupportLevel::OBSOLETE)
+        {
+          NS_LOG_WARN ("Attribute " << GetCurrentPath ()
+                                    << " was not saved because it is OBSOLETE");
+        }
+      else if ((supportLevel == TypeId::SupportLevel::DEPRECATED) && (m_saveDeprecated == false))
+        {
+          NS_LOG_WARN ("Attribute " << GetCurrentPath ()
+                                    << " was not saved because it is DEPRECATED");
+        }
+      else
+        {
+          object->GetAttribute (name, str);
+          NS_LOG_DEBUG ("Saving " << GetCurrentPath ());
+          *m_os << "value " << GetCurrentPath () << " \"" << str.Get () << "\"" << std::endl;
+        }
     }
     std::ostream *m_os;
+    bool m_saveDeprecated;
   };
 
   RawTextAttributeIterator iter = RawTextAttributeIterator (m_os);
+  iter.SetSaveDeprecated (m_saveDeprecated);
   iter.Iterate ();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/config-store/model/xml-config.cc ns-3.35/src/config-store/model/xml-config.cc
--- ns-3.34/src/config-store/model/xml-config.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/config-store/model/xml-config.cc	2021-10-01 13:26:47.000000000 -0700
@@ -106,12 +106,43 @@
     XmlDefaultIterator (xmlTextWriterPtr writer) {
       m_writer = writer;
     }
+    void
+    SetSaveDeprecated (bool saveDeprecated)
+    {
+      m_saveDeprecated = saveDeprecated;
+    }
+
 private:
     virtual void StartVisitTypeId (std::string name) {
       m_typeid = name;
     }
     virtual void DoVisitAttribute (std::string name, std::string defaultValue) {
-      int rc;
+      TypeId tid = TypeId::LookupByName (m_typeid);
+      ns3::TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED;
+      for (std::size_t i = 0; i < tid.GetAttributeN (); i++)
+        {
+          struct TypeId::AttributeInformation tmp = tid.GetAttribute (i);
+          if (tmp.name == name)
+            {
+              supportLevel = tmp.supportLevel;
+              break;
+            }
+        }
+      if (supportLevel == TypeId::SupportLevel::OBSOLETE)
+        {
+          NS_LOG_WARN ("Global attribute "
+                       << m_typeid << "::" << name
+                       << " was not saved because it is OBSOLETE");
+          return;
+        }
+      else if ((supportLevel == TypeId::SupportLevel::DEPRECATED) && (m_saveDeprecated == false))
+        {
+          NS_LOG_WARN ("Global attribute " << m_typeid << "::" << name
+                                           << " was not saved because it is DEPRECATED");
+          return;
+        }
+
+        int rc;
       rc = xmlTextWriterStartElement (m_writer, BAD_CAST "default");
       if (rc < 0)
         {
@@ -138,8 +169,10 @@
     }
     xmlTextWriterPtr m_writer;
     std::string m_typeid;
+    bool m_saveDeprecated;
   };
   XmlDefaultIterator iterator = XmlDefaultIterator (m_writer);
+  iterator.SetSaveDeprecated (m_saveDeprecated);
   iterator.Iterate ();
 }
 
@@ -151,8 +184,37 @@
 public:
     XmlTextAttributeIterator (xmlTextWriterPtr writer)
       : m_writer (writer) {}
-private:
+    void
+    SetSaveDeprecated (bool saveDeprecated)
+    {
+      m_saveDeprecated = saveDeprecated;
+    }
+
+  private:
     virtual void DoVisitAttribute (Ptr<Object> object, std::string name) {
+      TypeId tid = object->GetInstanceTypeId ();
+      ns3::TypeId::SupportLevel supportLevel = TypeId::SupportLevel::SUPPORTED;
+      for (std::size_t i = 0; i < tid.GetAttributeN (); i++)
+        {
+          struct TypeId::AttributeInformation tmp = tid.GetAttribute (i);
+          if (tmp.name == name)
+            {
+              supportLevel = tmp.supportLevel;
+              break;
+            }
+        }
+      if (supportLevel == TypeId::SupportLevel::OBSOLETE)
+        {
+          NS_LOG_WARN ("Attribute " << GetCurrentPath ()
+                                    << " was not saved because it is OBSOLETE");
+          return;
+        }
+      else if ((supportLevel == TypeId::SupportLevel::DEPRECATED) && (m_saveDeprecated == false))
+        {
+          NS_LOG_WARN ("Attribute " << GetCurrentPath ()
+                                    << " was not saved because it is DEPRECATED");
+          return;
+        }
       StringValue str;
       object->GetAttribute (name, str);
       int rc;
@@ -180,9 +242,11 @@
         }
     }
     xmlTextWriterPtr m_writer;
+    bool m_saveDeprecated;
   };
 
   XmlTextAttributeIterator iter = XmlTextAttributeIterator (m_writer);
+  iter.SetSaveDeprecated (m_saveDeprecated);
   iter.Iterate ();
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/bindings/modulegen__gcc_ILP32.py ns-3.35/src/core/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/core/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -2395,6 +2395,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -2422,6 +2427,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -5450,6 +5460,14 @@
     module.add_function('CalculateDistance', 
                         'double', 
                         [param('ns3::Vector3D const &', 'a'), param('ns3::Vector3D const &', 'b')])
+    ## vector.h (module 'core'): double ns3::CalculateDistanceSquared(ns3::Vector2D const & a, ns3::Vector2D const & b) [free function]
+    module.add_function('CalculateDistanceSquared', 
+                        'double', 
+                        [param('ns3::Vector2D const &', 'a'), param('ns3::Vector2D const &', 'b')])
+    ## vector.h (module 'core'): double ns3::CalculateDistanceSquared(ns3::Vector3D const & a, ns3::Vector3D const & b) [free function]
+    module.add_function('CalculateDistanceSquared', 
+                        'double', 
+                        [param('ns3::Vector3D const &', 'a'), param('ns3::Vector3D const &', 'b')])
     ## length.h (module 'core'): ns3::Length ns3::CentiMeters(double value) [free function]
     module.add_function('CentiMeters', 
                         'ns3::Length', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/bindings/modulegen__gcc_LP64.py ns-3.35/src/core/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/core/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -2395,6 +2395,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -2422,6 +2427,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -5450,6 +5460,14 @@
     module.add_function('CalculateDistance', 
                         'double', 
                         [param('ns3::Vector3D const &', 'a'), param('ns3::Vector3D const &', 'b')])
+    ## vector.h (module 'core'): double ns3::CalculateDistanceSquared(ns3::Vector2D const & a, ns3::Vector2D const & b) [free function]
+    module.add_function('CalculateDistanceSquared', 
+                        'double', 
+                        [param('ns3::Vector2D const &', 'a'), param('ns3::Vector2D const &', 'b')])
+    ## vector.h (module 'core'): double ns3::CalculateDistanceSquared(ns3::Vector3D const & a, ns3::Vector3D const & b) [free function]
+    module.add_function('CalculateDistanceSquared', 
+                        'double', 
+                        [param('ns3::Vector3D const &', 'a'), param('ns3::Vector3D const &', 'b')])
     ## length.h (module 'core'): ns3::Length ns3::CentiMeters(double value) [free function]
     module.add_function('CentiMeters', 
                         'ns3::Length', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/deprecated.h ns-3.35/src/core/model/deprecated.h
--- ns-3.34/src/core/model/deprecated.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/deprecated.h	2021-10-01 13:26:47.000000000 -0700
@@ -64,38 +64,20 @@
 
 /**
  * \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.
+ * \def NS_DEPRECATED_3_35
+ * Tag for things deprecated in version ns-3.35.
  */
 #ifdef NS_DEPRECATED
-#define NS_DEPRECATED_3_32 NS_DEPRECATED
+#define NS_DEPRECATED_3_35 NS_DEPRECATED
 #endif
 
 /**
  * \ingroup core
- * \def NS_DEPRECATED_3_31
- * Tag for things deprecated in version ns-3.31.
- */
-#ifdef NS_DEPRECATED
-#define NS_DEPRECATED_3_31 NS_DEPRECATED
-#endif
-
-/**
- * \ingroup core
- * \def NS_DEPRECATED_3_30
- * Tag for things deprecated in version ns-3.30.
+ * \def NS_DEPRECATED_3_34
+ * Tag for things deprecated in version ns-3.34.
  */
 #ifdef NS_DEPRECATED
-#define NS_DEPRECATED_3_30 NS_DEPRECATED
+#define NS_DEPRECATED_3_34 NS_DEPRECATED
 #endif
 
 #endif /* NS3_DEPRECATED_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/enum.cc ns-3.35/src/core/model/enum.cc
--- ns-3.34/src/core/model/enum.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/enum.cc	2021-10-01 13:26:47.000000000 -0700
@@ -22,6 +22,7 @@
 #include "log.h"
 #include <algorithm>  // find_if
 #include <sstream>
+#include <numeric> // std::accumulate
 
 /**
  * \file
@@ -112,7 +113,17 @@
   auto it = std::find_if (m_valueSet.begin (), m_valueSet.end (),
                           [name] (Value v) { return v.second == name; } );
   NS_ASSERT_MSG (it != m_valueSet.end (),
-                 "name " << name << " not a valid enum value. Missed entry in MakeEnumChecker?");
+                 "name " << name << " is not a valid enum value. Missed entry in MakeEnumChecker?\nAvailable values: " <<
+                 std::accumulate (m_valueSet.begin (), m_valueSet.end (), std::string{}, [](std::string a, Value v) {
+                   if (a.empty ())
+                     {
+                       return v.second;
+                     }
+                   else
+                     {
+                       return std::move (a) + ", " + v.second;
+                     }
+                 }));
   return it->first;
 }
 bool
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/ptr.h ns-3.35/src/core/model/ptr.h
--- ns-3.34/src/core/model/ptr.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/ptr.h	2021-10-01 13:26:47.000000000 -0700
@@ -226,7 +226,7 @@
  */
 template <typename T,
           typename... Ts>
-Ptr<T> Create (Ts... args);
+Ptr<T> Create (Ts&&... args);
 
 /** @}*/
 
@@ -317,7 +317,11 @@
 template <typename T>
 bool operator < (const Ptr<T> &lhs, const Ptr<T> &rhs);
 template <typename T>
-bool operator <= (const Ptr<T> &lhs, const Ptr<T> &rhs);
+bool operator< (const Ptr<T> &lhs, const Ptr<const T> &rhs);
+template <typename T>
+bool operator< (const Ptr<const T> &lhs, const Ptr<T> &rhs);
+template <typename T>
+bool operator<= (const Ptr<T> &lhs, const Ptr<T> &rhs);
 template <typename T>
 bool operator > (const Ptr<T> &lhs, const Ptr<T> &rhs);
 template <typename T>
@@ -402,9 +406,9 @@
  ************************************************/
 
 template <typename T, typename... Ts>
-Ptr<T> Create (Ts... args)
+Ptr<T> Create (Ts&&... args)
 {
-  return Ptr<T> (new T (args...), false);
+  return Ptr<T> (new T (std::forward<Ts> (args)...), false);
 }
 
 template <typename U>
@@ -476,7 +480,22 @@
 }
 
 template <typename T>
-bool operator <= (const Ptr<T> &lhs, const Ptr<T> &rhs)
+bool
+operator< (const Ptr<T> &lhs, const Ptr<const T> &rhs)
+{
+  return PeekPointer<T> (lhs) < PeekPointer<const T> (rhs);
+}
+
+template <typename T>
+bool
+operator< (const Ptr<const T> &lhs, const Ptr<T> &rhs)
+{
+  return PeekPointer<const T> (lhs) < PeekPointer<T> (rhs);
+}
+
+template <typename T>
+bool
+operator<= (const Ptr<T> &lhs, const Ptr<T> &rhs)
 {
   return PeekPointer<T> (lhs) <= PeekPointer<T> (rhs);
 }
@@ -676,4 +695,39 @@
 
 } // namespace ns3
 
+
+/****************************************************
+ *      Global Functions (outside namespace ns3)
+ ***************************************************/
+
+/**
+ * \ingroup ptr
+ * Hashing functor taking a `Ptr` and returning a @c std::size_t.
+ * For use with `unordered_map` and `unordered_set`.
+ *
+ * \note When a `Ptr` is used in a container the lifetime of the underlying
+ * object is at least as long as the container.  In other words,
+ * you need to remove the object from the container when you are done with
+ * it, otherwise the object will persist until the container itself is
+ * deleted.
+ *
+ * \tparam T \deduced The type held by the `Ptr`
+ */
+template<class T>
+struct
+std::hash<ns3::Ptr<T>>
+{
+  /**
+   * The functor.
+   * \param p The `Ptr` value to hash.
+   * \return the hash
+   */
+  std::size_t
+  operator () (ns3::Ptr<T> p) const
+  {
+    return std::hash<const T *> () (ns3::PeekPointer (p));
+  }
+};
+
+
 #endif /* PTR_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/random-variable-stream.cc ns-3.35/src/core/model/random-variable-stream.cc
--- ns-3.34/src/core/model/random-variable-stream.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/random-variable-stream.cc	2021-10-01 13:26:47.000000000 -0700
@@ -455,12 +455,6 @@
     .SetParent<RandomVariableStream>()
     .SetGroupName ("Core")
     .AddConstructor<ParetoRandomVariable> ()
-    .AddAttribute ("Mean", "The mean parameter for the Pareto distribution returned by this RNG stream.",
-                   DoubleValue (0.0),
-                   MakeDoubleAccessor (&ParetoRandomVariable::m_mean),
-                   MakeDoubleChecker<double>(),
-                   TypeId::DEPRECATED,
-                   "Not anymore used. Use 'Scale' instead - changing this attribute has no effect.")
     .AddAttribute ("Scale", "The scale parameter for the Pareto distribution returned by this RNG stream.",
                    DoubleValue (1.0),
                    MakeDoubleAccessor (&ParetoRandomVariable::m_scale),
@@ -481,7 +475,6 @@
   // m_shape, m_shape, and m_bound are initialized after constructor
   // by attributes
   NS_LOG_FUNCTION (this);
-  NS_UNUSED (m_mean);
 }
 
 double
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/random-variable-stream.h ns-3.35/src/core/model/random-variable-stream.h
--- ns-3.34/src/core/model/random-variable-stream.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/random-variable-stream.h	2021-10-01 13:26:47.000000000 -0700
@@ -786,9 +786,6 @@
   virtual uint32_t GetInteger (void);
 
 private:
-  /** The mean parameter for the Pareto distribution returned by this RNG stream. */
-  double m_mean;
-
   /** The scale parameter for the Pareto distribution returned by this RNG stream. */
   double m_scale;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/timer.h ns-3.35/src/core/model/timer.h
--- ns-3.34/src/core/model/timer.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/timer.h	2021-10-01 13:26:47.000000000 -0700
@@ -106,9 +106,9 @@
   /** The possible states of the Timer. */
   enum State
   {
-    RUNNING,    /** Timer is currently running. */
-    EXPIRED,    /** Timer has already expired. */
-    SUSPENDED,  /** Timer is suspended. */
+    RUNNING,    /**< Timer is currently running. */
+    EXPIRED,    /**< Timer has already expired. */
+    SUSPENDED,  /**< Timer is suspended. */
   };
   /**
    * Create a timer with a default event lifetime management policy:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/traced-callback.h ns-3.35/src/core/model/traced-callback.h
--- ns-3.34/src/core/model/traced-callback.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/traced-callback.h	2021-10-01 13:26:47.000000000 -0700
@@ -89,6 +89,11 @@
    * \param [in] args The arguments to the functor
    */
   void operator() (Ts... args) const;
+  /**
+   * \brief Checks if the Callbacks list is empty.
+   * \return true if the Callbacks list is empty.
+   */
+  bool IsEmpty () const;
 
   /**
    *  TracedCallback signature for POD.
@@ -188,6 +193,13 @@
     }
 }
 
+template <typename... Ts>
+bool
+TracedCallback<Ts...>::IsEmpty () const
+{
+  return m_callbackList.empty ();
+}
+
 } // namespace ns3
 
 #endif /* TRACED_CALLBACK_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/vector.cc ns-3.35/src/core/model/vector.cc
--- ns-3.34/src/core/model/vector.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/vector.cc	2021-10-01 13:26:47.000000000 -0700
@@ -89,6 +89,19 @@
 }
 
 double
+Vector3D::GetLengthSquared () const
+{
+  NS_LOG_FUNCTION (this);
+  return x * x + y * y + z * z;
+}
+double
+Vector2D::GetLengthSquared () const
+{
+  NS_LOG_FUNCTION (this);
+  return x * x + y * y;
+}
+
+double
 CalculateDistance (const Vector3D &a, const Vector3D &b)
 {
   NS_LOG_FUNCTION (a << b);
@@ -101,6 +114,19 @@
   return (b - a).GetLength ();
 }
 
+double
+CalculateDistanceSquared (const Vector3D &a, const Vector3D &b)
+{
+  NS_LOG_FUNCTION (a << b);
+  return (b - a).GetLengthSquared ();
+}
+double
+CalculateDistanceSquared (const Vector2D &a, const Vector2D &b)
+{
+  NS_LOG_FUNCTION (a << b);
+  return (b - a).GetLengthSquared ();
+}
+
 std::ostream &operator << (std::ostream &os, const Vector3D &vector)
 {
   os << vector.x << ":" << vector.y << ":" << vector.z;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/model/vector.h ns-3.35/src/core/model/vector.h
--- ns-3.34/src/core/model/vector.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/model/vector.h	2021-10-01 13:26:47.000000000 -0700
@@ -67,6 +67,12 @@
   double GetLength () const;
 
   /**
+   * Compute the squared length of the vector.
+   * \returns the vector length squared.
+   */
+  double GetLengthSquared () const;
+
+  /**
    * \brief Calculate the Cartesian distance between two points.
    * \param [in] a One point
    * \param [in] b Another point
@@ -75,6 +81,14 @@
   friend double CalculateDistance (const Vector3D &a, const Vector3D &b);
 
   /**
+   * \brief Calculate the squared Cartesian distance between two points.
+   * \param [in] a One point
+   * \param [in] b Another point
+   * \returns The distance between \pname{a} and \pname{b}.
+   */
+  friend double CalculateDistanceSquared (const Vector3D &a, const Vector3D &b);
+
+  /**
    * Output streamer.
    * Vectors are written as "x:y:z".
    *
@@ -184,6 +198,9 @@
   /** \copydoc Vector3D::GetLength() */
   double GetLength () const;
 
+  /** \copydoc Vector3D::GetLengthSquared() */
+  double GetLengthSquared () const;
+
   /**
    * \brief Calculate the Cartesian distance between two points.
    * \param [in] a One point
@@ -193,6 +210,14 @@
   friend double CalculateDistance (const Vector2D &a, const Vector2D &b);
 
   /**
+   * \brief Calculate the squared Cartesian distance between two points.
+   * \param [in] a One point
+   * \param [in] b Another point
+   * \returns The distance between \pname{a} and \pname{b}.
+   */
+  friend double CalculateDistanceSquared (const Vector2D &a, const Vector2D &b);
+
+  /**
    * Output streamer.
    * Vectors are written as "x:y".
    *
@@ -280,6 +305,8 @@
 
 double CalculateDistance (const Vector3D &a, const Vector3D &b);
 double CalculateDistance (const Vector2D &a, const Vector2D &b);
+double CalculateDistanceSquared (const Vector3D &a, const Vector3D &b);
+double CalculateDistanceSquared (const Vector2D &a, const Vector2D &b);
 std::ostream &operator << (std::ostream &os, const Vector3D &vector);
 std::ostream &operator << (std::ostream &os, const Vector2D &vector);
 std::istream &operator >> (std::istream &is, Vector3D &vector);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/core/wscript ns-3.35/src/core/wscript
--- ns-3.34/src/core/wscript	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/core/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -48,7 +48,7 @@
                     dest='check_version')
 
     opt.add_option('--enable-build-version',
-                    help=("Check git repository for changes and update build version"
+                    help=("Check git repository for changes and update build version "
                           "during waf build"),
                     action="store_true", default=False,
                     dest='enable_build_version')
@@ -57,7 +57,7 @@
 
     conf.load('versioning', ['waf-tools'])
 
-    conf.require_boost_incs('core', 'ns-3 core module', required=False);
+    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':
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/csma/bindings/modulegen__gcc_ILP32.py ns-3.35/src/csma/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/csma/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/csma/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1726,11 +1726,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1835,11 +1830,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1956,11 +1946,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2153,11 +2138,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/csma/bindings/modulegen__gcc_LP64.py ns-3.35/src/csma/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/csma/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/csma/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1726,11 +1726,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1835,11 +1830,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1956,11 +1946,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2153,11 +2138,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/csma-layout/bindings/modulegen__gcc_ILP32.py ns-3.35/src/csma-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/csma-layout/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1957,11 +1957,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2059,6 +2054,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -2079,11 +2079,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2204,11 +2213,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2325,11 +2329,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2772,11 +2771,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4734,11 +4728,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4779,11 +4778,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4804,10 +4808,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4832,10 +4841,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/csma-layout/bindings/modulegen__gcc_LP64.py ns-3.35/src/csma-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/csma-layout/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/csma-layout/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1957,11 +1957,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2059,6 +2054,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -2079,11 +2079,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2204,11 +2213,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2325,11 +2329,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2772,11 +2771,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4734,11 +4728,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4779,11 +4778,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4804,10 +4808,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4832,10 +4841,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/dsdv/bindings/modulegen__gcc_ILP32.py ns-3.35/src/dsdv/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/dsdv/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/dsdv/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1656,11 +1656,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1733,6 +1728,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1753,11 +1753,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1826,11 +1835,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2004,11 +2008,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2201,11 +2200,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/dsdv/bindings/modulegen__gcc_LP64.py ns-3.35/src/dsdv/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/dsdv/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/dsdv/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1656,11 +1656,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1733,6 +1728,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1753,11 +1753,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1826,11 +1835,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2004,11 +2008,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2201,11 +2200,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/dsr/bindings/modulegen__gcc_ILP32.py ns-3.35/src/dsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/dsr/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/dsr/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -23,9 +23,9 @@
     ## 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')
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], 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')
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], 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]
@@ -37,7 +37,7 @@
     ## 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_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_80211p', '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]
@@ -421,12 +421,12 @@
     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]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -679,8 +679,8 @@
     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')
-    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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header >', container_type='list')
     module.add_container('std::list< ns3::ArpCache::Entry * >', 'ns3::ArpCache::Entry *', container_type='list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
@@ -2239,11 +2239,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2316,6 +2311,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -2336,11 +2336,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2409,11 +2418,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2530,11 +2534,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2727,11 +2726,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4242,6 +4236,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -4871,11 +4867,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4916,11 +4917,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4941,10 +4947,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4969,10 +4980,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
@@ -6339,6 +6355,10 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -6486,6 +6506,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/dsr/bindings/modulegen__gcc_LP64.py ns-3.35/src/dsr/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/dsr/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/dsr/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -23,9 +23,9 @@
     ## 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')
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], 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')
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], 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]
@@ -37,7 +37,7 @@
     ## 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_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_80211p', '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]
@@ -421,12 +421,12 @@
     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]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -679,8 +679,8 @@
     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')
-    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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     module.add_container('std::list< std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header > >', 'std::pair< ns3::Ptr< ns3::Packet >, ns3::Ipv4Header >', container_type='list')
     module.add_container('std::list< ns3::ArpCache::Entry * >', 'ns3::ArpCache::Entry *', container_type='list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
@@ -2239,11 +2239,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2316,6 +2311,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -2336,11 +2336,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2409,11 +2418,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2530,11 +2534,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2727,11 +2726,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4242,6 +4236,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -4871,11 +4867,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4916,11 +4917,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4941,10 +4947,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4969,10 +4980,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
@@ -6339,6 +6355,10 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -6486,6 +6506,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/dsr/model/dsr-routing.cc ns-3.35/src/dsr/model/dsr-routing.cc
--- ns-3.34/src/dsr/model/dsr-routing.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/dsr/model/dsr-routing.cc	2021-10-01 13:26:47.000000000 -0700
@@ -3487,7 +3487,7 @@
                      Ipv6Header const &ip,
                      Ptr<Ipv6Interface> incomingInterface)
 {
-  NS_LOG_FUNCTION (this << p << ip.GetSourceAddress () << ip.GetDestinationAddress () << incomingInterface);
+  NS_LOG_FUNCTION (this << p << ip.GetSource () << ip.GetDestination () << incomingInterface);
   return IpL4Protocol::RX_ENDPOINT_UNREACH;
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/energy/bindings/modulegen__gcc_ILP32.py ns-3.35/src/energy/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/energy/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/energy/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1563,11 +1563,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1672,11 +1667,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1793,11 +1783,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1990,11 +1975,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/energy/bindings/modulegen__gcc_LP64.py ns-3.35/src/energy/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/energy/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/energy/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1563,11 +1563,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1672,11 +1667,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1793,11 +1783,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1990,11 +1975,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/energy/model/simple-device-energy-model.cc ns-3.35/src/energy/model/simple-device-energy-model.cc
--- ns-3.34/src/energy/model/simple-device-energy-model.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/energy/model/simple-device-energy-model.cc	2021-10-01 13:26:47.000000000 -0700
@@ -104,7 +104,7 @@
 
   double energyToDecrease = 0.0;
   double supplyVoltage = m_source->GetSupplyVoltage ();
-  energyToDecrease = duration.GetSeconds () * current * supplyVoltage;
+  energyToDecrease = duration.GetSeconds () * m_actualCurrentA * supplyVoltage;
 
   // update total energy consumption
   m_totalEnergyConsumption += energyToDecrease;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/fd-net-device/bindings/modulegen__gcc_ILP32.py ns-3.35/src/fd-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/fd-net-device/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1531,11 +1531,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1640,11 +1635,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1761,11 +1751,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1958,11 +1943,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/fd-net-device/bindings/modulegen__gcc_LP64.py ns-3.35/src/fd-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/fd-net-device/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1531,11 +1531,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1640,11 +1635,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1761,11 +1751,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1958,11 +1943,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/fd-net-device/model/fd-net-device.cc ns-3.35/src/fd-net-device/model/fd-net-device.cc
--- ns-3.34/src/fd-net-device/model/fd-net-device.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/fd-net-device/model/fd-net-device.cc	2021-10-01 13:26:47.000000000 -0700
@@ -296,6 +296,13 @@
       m_fd = -1;
     }
 
+  while (!m_pendingQueue.empty ())
+    {
+      std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
+      m_pendingQueue.pop ();
+      FreeBuffer (next.first);
+    }
+
   DoFinishStoppingDevice ();
 }
 
@@ -415,6 +422,12 @@
   uint8_t *buf = 0;
   ssize_t len = 0;
 
+  if (m_pendingQueue.empty())
+  {
+    NS_LOG_LOGIC ("buffer is empty, probably the device is stopped.");
+    return;
+  }
+
   {
     CriticalSection cs (m_pendingReadMutex);
     std::pair<uint8_t *, ssize_t> next = m_pendingQueue.front ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/flow-monitor/bindings/modulegen__gcc_ILP32.py ns-3.35/src/flow-monitor/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/flow-monitor/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1694,11 +1694,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1771,6 +1766,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1791,11 +1791,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1864,11 +1873,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1985,11 +1989,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2253,11 +2252,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3786,11 +3780,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -3831,11 +3830,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -3856,10 +3860,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -3884,10 +3893,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/flow-monitor/bindings/modulegen__gcc_LP64.py ns-3.35/src/flow-monitor/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/flow-monitor/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1694,11 +1694,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1771,6 +1766,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1791,11 +1791,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1864,11 +1873,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1985,11 +1989,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2253,11 +2252,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3786,11 +3780,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -3831,11 +3830,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -3856,10 +3860,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -3884,10 +3893,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/flow-monitor/examples/flowmon-parse-results.py ns-3.35/src/flow-monitor/examples/flowmon-parse-results.py
--- ns-3.34/src/flow-monitor/examples/flowmon-parse-results.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/flow-monitor/examples/flowmon-parse-results.py	2021-10-01 13:26:47.000000000 -0700
@@ -8,7 +8,7 @@
 
 def parse_time_ns(tm):
     if tm.endswith('ns'):
-        return long(tm[:-4])
+        return float(tm[:-2])
     raise ValueError(tm)
 
 
@@ -26,11 +26,11 @@
     #  source port
     ## @var destinationPort 
     #  destination port
-    ## @var __slots__ 
+    ## @var __slots_ 
     #  class variable list
-    __slots__ = ['sourceAddress', 'destinationAddress', 'protocol', 'sourcePort', 'destinationPort']
+    __slots_ = ['sourceAddress', 'destinationAddress', 'protocol', 'sourcePort', 'destinationPort']
     def __init__(self, el):
-        '''The initializer.
+        '''! The initializer.
         @param self The object pointer.
         @param el The element.
         '''
@@ -49,11 +49,11 @@
     #  number of bins
     ## @var number_of_flows
     #  number of flows
-    ## @var __slots__
+    ## @var __slots_
     #  class variable list
-    __slots__ = 'bins', 'nbins', 'number_of_flows'
+    __slots_ = 'bins', 'nbins', 'number_of_flows'
     def __init__(self, el=None):
-        ''' The initializer.
+        '''! The initializer.
         @param self The object pointer.
         @param el The element.
         '''
@@ -88,21 +88,22 @@
     #  flow histogram
     ## @var rx_duration
     #  receive duration
-    ## @var __slots__
+    ## @var __slots_
     #  class variable list
-    __slots__ = ['flowId', 'delayMean', 'packetLossRatio', 'rxBitrate', 'txBitrate',
-                 'fiveTuple', 'packetSizeMean', 'probe_stats_unsorted',
-                 'hopCount', 'flowInterruptionsHistogram', 'rx_duration']
+    __slots_ = ['flowId', 'delayMean', 'packetLossRatio', 'rxBitrate', 'txBitrate',
+                'fiveTuple', 'packetSizeMean', 'probe_stats_unsorted',
+                'hopCount', 'flowInterruptionsHistogram', 'rx_duration']
     def __init__(self, flow_el):
-        ''' The initializer.
+        '''! The initializer.
         @param self The object pointer.
         @param flow_el The element.
         '''
         self.flowId = int(flow_el.get('flowId'))
-        rxPackets = long(flow_el.get('rxPackets'))
-        txPackets = long(flow_el.get('txPackets'))
-        tx_duration = float(long(flow_el.get('timeLastTxPacket')[:-4]) - long(flow_el.get('timeFirstTxPacket')[:-4]))*1e-9
-        rx_duration = float(long(flow_el.get('timeLastRxPacket')[:-4]) - long(flow_el.get('timeFirstRxPacket')[:-4]))*1e-9
+        rxPackets = float(flow_el.get('rxPackets'))
+        txPackets = float(flow_el.get('txPackets'))
+
+        tx_duration = (parse_time_ns (flow_el.get('timeLastTxPacket')) - parse_time_ns(flow_el.get('timeFirstTxPacket')))*1e-9
+        rx_duration = (parse_time_ns (flow_el.get('timeLastRxPacket')) - parse_time_ns(flow_el.get('timeFirstRxPacket')))*1e-9
         self.rx_duration = rx_duration
         self.probe_stats_unsorted = []
         if rxPackets:
@@ -110,17 +111,17 @@
         else:
             self.hopCount = -1000
         if rxPackets:
-            self.delayMean = float(flow_el.get('delaySum')[:-4]) / rxPackets * 1e-9
+            self.delayMean = float(flow_el.get('delaySum')[:-2]) / rxPackets * 1e-9
             self.packetSizeMean = float(flow_el.get('rxBytes')) / rxPackets
         else:
             self.delayMean = None
             self.packetSizeMean = None
         if rx_duration > 0:
-            self.rxBitrate = long(flow_el.get('rxBytes'))*8 / rx_duration
+            self.rxBitrate = float(flow_el.get('rxBytes'))*8 / rx_duration
         else:
             self.rxBitrate = None
         if tx_duration > 0:
-            self.txBitrate = long(flow_el.get('txBytes'))*8 / tx_duration
+            self.txBitrate = float(flow_el.get('txBytes'))*8 / tx_duration
         else:
             self.txBitrate = None
         lost = float(flow_el.get('lostPackets'))
@@ -147,9 +148,9 @@
     #  bytes
     ## @var delayFromFirstProbe
     #  delay from first probe
-    ## @var __slots__
+    ## @var __slots_
     #  class variable list
-    __slots__ = ['probeId', 'packets', 'bytes', 'delayFromFirstProbe']
+    __slots_ = ['probeId', 'packets', 'bytes', 'delayFromFirstProbe']
 
 ## Simulation
 class Simulation(object):
@@ -157,7 +158,7 @@
     ## @var flows
     #  list of flows
     def __init__(self, simulation_el):
-        ''' The initializer.
+        '''! The initializer.
         @param self The object pointer.
         @param simulation_el The element.
         '''
@@ -178,7 +179,7 @@
                 flowId = int(stats.get('flowId'))
                 s = ProbeFlowStats()
                 s.packets = int(stats.get('packets'))
-                s.bytes = long(stats.get('bytes'))
+                s.bytes = float(stats.get('bytes'))
                 s.probeId = probeId
                 if s.packets > 0:
                     s.delayFromFirstProbe =  parse_time_ns(stats.get('delayFromFirstProbeSum')) / float(s.packets)
@@ -189,7 +190,7 @@
 
 def main(argv):
     file_obj = open(argv[1])
-    print "Reading XML file ",
+    print("Reading XML file ", end=" ")
  
     sys.stdout.flush()        
     level = 0
@@ -205,31 +206,31 @@
                 elem.clear() # won't need this any more
                 sys.stdout.write(".")
                 sys.stdout.flush()
-    print " done."
+    print(" done.")
 
 
     for sim in sim_list:
         for flow in sim.flows:
             t = flow.fiveTuple
             proto = {6: 'TCP', 17: 'UDP'} [t.protocol]
-            print "FlowID: %i (%s %s/%s --> %s/%i)" % \
-                (flow.flowId, proto, t.sourceAddress, t.sourcePort, t.destinationAddress, t.destinationPort)
+            print("FlowID: %i (%s %s/%s --> %s/%i)" % \
+                (flow.flowId, proto, t.sourceAddress, t.sourcePort, t.destinationAddress, t.destinationPort))
             if flow.txBitrate is None:
-                print "\tTX bitrate: None"
+                print("\tTX bitrate: None")
             else:
-                print "\tTX bitrate: %.2f kbit/s" % (flow.txBitrate*1e-3,)
+                print("\tTX bitrate: %.2f kbit/s" % (flow.txBitrate*1e-3,))
             if flow.rxBitrate is None:
-                print "\tRX bitrate: None"
+                print("\tRX bitrate: None")
             else:
-                print "\tRX bitrate: %.2f kbit/s" % (flow.rxBitrate*1e-3,)
+                print("\tRX bitrate: %.2f kbit/s" % (flow.rxBitrate*1e-3,))
             if flow.delayMean is None:
-                print "\tMean Delay: None"
+                print("\tMean Delay: None")
             else:
-                print "\tMean Delay: %.2f ms" % (flow.delayMean*1e3,)
+                print("\tMean Delay: %.2f ms" % (flow.delayMean*1e3,))
             if flow.packetLossRatio is None:
-                print "\tPacket Loss Ratio: None"
+                print("\tPacket Loss Ratio: None")
             else:
-                print "\tPacket Loss Ratio: %.2f %%" % (flow.packetLossRatio*100)
+                print("\tPacket Loss Ratio: %.2f %%" % (flow.packetLossRatio*100))
 
 
 if __name__ == '__main__':
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/flow-monitor/model/flow-monitor.cc ns-3.35/src/flow-monitor/model/flow-monitor.cc
--- ns-3.34/src/flow-monitor/model/flow-monitor.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/flow-monitor/model/flow-monitor.cc	2021-10-01 13:26:47.000000000 -0700
@@ -430,14 +430,15 @@
     {
       os << std::string ( indent, ' ' );
 #define ATTRIB(name) << " " # name "=\"" << flowI->second.name << "\""
+#define ATTRIB_TIME(name) << " " #name "=\"" << flowI->second.name.As (Time::NS) << "\""
       os << "<Flow flowId=\"" << flowI->first << "\""
-      ATTRIB (timeFirstTxPacket)
-      ATTRIB (timeFirstRxPacket)
-      ATTRIB (timeLastTxPacket)
-      ATTRIB (timeLastRxPacket)
-      ATTRIB (delaySum)
-      ATTRIB (jitterSum)
-      ATTRIB (lastDelay)
+      ATTRIB_TIME (timeFirstTxPacket)
+      ATTRIB_TIME (timeFirstRxPacket)
+      ATTRIB_TIME (timeLastTxPacket)
+      ATTRIB_TIME (timeLastRxPacket)
+      ATTRIB_TIME (delaySum)
+      ATTRIB_TIME (jitterSum)
+      ATTRIB_TIME (lastDelay)
       ATTRIB (txBytes)
       ATTRIB (rxBytes)
       ATTRIB (txPackets)
@@ -445,6 +446,7 @@
       ATTRIB (lostPackets)
       ATTRIB (timesForwarded)
       << ">\n";
+#undef ATTRIB_TIME
 #undef ATTRIB
 
       indent += 2;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/flow-monitor/model/ipv6-flow-classifier.cc ns-3.35/src/flow-monitor/model/ipv6-flow-classifier.cc
--- ns-3.34/src/flow-monitor/model/ipv6-flow-classifier.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/flow-monitor/model/ipv6-flow-classifier.cc	2021-10-01 13:26:47.000000000 -0700
@@ -105,15 +105,15 @@
 Ipv6FlowClassifier::Classify (const Ipv6Header &ipHeader, Ptr<const Packet> ipPayload,
                               uint32_t *out_flowId, uint32_t *out_packetId)
 {
-  if (ipHeader.GetDestinationAddress ().IsMulticast ())
+  if (ipHeader.GetDestination ().IsMulticast ())
     {
       // we are not prepared to handle multicast yet
       return false;
     }
 
   FiveTuple tuple;
-  tuple.sourceAddress = ipHeader.GetSourceAddress ();
-  tuple.destinationAddress = ipHeader.GetDestinationAddress ();
+  tuple.sourceAddress = ipHeader.GetSource ();
+  tuple.destinationAddress = ipHeader.GetDestination ();
   tuple.protocol = ipHeader.GetNextHeader ();
 
   if ((tuple.protocol != UDP_PROT_NUMBER) && (tuple.protocol != TCP_PROT_NUMBER))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/flow-monitor/model/ipv6-flow-probe.cc ns-3.35/src/flow-monitor/model/ipv6-flow-probe.cc
--- ns-3.34/src/flow-monitor/model/ipv6-flow-probe.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/flow-monitor/model/ipv6-flow-probe.cc	2021-10-01 13:26:47.000000000 -0700
@@ -341,7 +341,7 @@
 
       uint32_t size = (ipPayload->GetSize () + ipHeader.GetSerializedSize ());
       NS_LOG_DEBUG ("Drop ("<<this<<", "<<flowId<<", "<<packetId<<", "<<size<<", " << reason 
-                            << ", destIp=" << ipHeader.GetDestinationAddress () << "); "
+                            << ", destIp=" << ipHeader.GetDestination () << "); "
                             << "HDR: " << ipHeader << " PKT: " << *ipPayload);
 
       DropReason myReason;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/bindings/modulegen__gcc_ILP32.py ns-3.35/src/internet/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/internet/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -3235,11 +3235,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -3517,6 +3512,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -3537,11 +3537,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -3662,11 +3671,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4021,11 +4025,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4636,11 +4635,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -8956,11 +8950,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -9001,11 +9000,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -9026,10 +9030,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -9054,10 +9063,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/bindings/modulegen__gcc_LP64.py ns-3.35/src/internet/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/internet/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -3235,11 +3235,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -3517,6 +3512,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -3537,11 +3537,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -3662,11 +3671,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4021,11 +4025,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4636,11 +4635,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -8956,11 +8950,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -9001,11 +9000,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -9026,10 +9030,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -9054,10 +9063,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/icmpv4-l4-protocol.cc ns-3.35/src/internet/model/icmpv4-l4-protocol.cc
--- ns-3.34/src/internet/model/icmpv4-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/icmpv4-l4-protocol.cc	2021-10-01 13:26:47.000000000 -0700
@@ -288,7 +288,7 @@
                            Ipv6Header const &header,
                            Ptr<Ipv6Interface> incomingInterface)
 {
-  NS_LOG_FUNCTION (this << p << header.GetSourceAddress () << header.GetDestinationAddress () << incomingInterface);
+  NS_LOG_FUNCTION (this << p << header.GetSource () << header.GetDestination () << incomingInterface);
   return IpL4Protocol::RX_ENDPOINT_UNREACH;
 }
 void 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/icmpv6-l4-protocol.cc ns-3.35/src/internet/model/icmpv6-l4-protocol.cc
--- ns-3.34/src/internet/model/icmpv6-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/icmpv6-l4-protocol.cc	2021-10-01 13:26:47.000000000 -0700
@@ -224,7 +224,7 @@
 
 enum IpL4Protocol::RxStatus Icmpv6L4Protocol::Receive (Ptr<Packet> packet, Ipv6Header const &header, Ptr<Ipv6Interface> interface)
 {
-  NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << header.GetDestinationAddress () << interface);
+  NS_LOG_FUNCTION (this << packet << header.GetSource () << header.GetDestination () << interface);
   Ptr<Packet> p = packet->Copy ();
   Ptr<Ipv6> ipv6 = m_node->GetObject<Ipv6> ();
 
@@ -237,26 +237,26 @@
     case Icmpv6Header::ICMPV6_ND_ROUTER_SOLICITATION:
       if (ipv6->IsForwarding (ipv6->GetInterfaceForDevice (interface->GetDevice ())))
         {
-          HandleRS (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+          HandleRS (p, header.GetSource (), header.GetDestination (), interface);
         }
       break;
     case Icmpv6Header::ICMPV6_ND_ROUTER_ADVERTISEMENT:
       if (!ipv6->IsForwarding (ipv6->GetInterfaceForDevice (interface->GetDevice ())))
         {
-          HandleRA (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+          HandleRA (p, header.GetSource (), header.GetDestination (), interface);
         }
       break;
     case Icmpv6Header::ICMPV6_ND_NEIGHBOR_SOLICITATION:
-      HandleNS (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleNS (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ND_NEIGHBOR_ADVERTISEMENT:
-      HandleNA (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleNA (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ND_REDIRECTION:
-      HandleRedirection (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleRedirection (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ECHO_REQUEST:
-      HandleEchoRequest (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleEchoRequest (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ECHO_REPLY:
       // EchoReply does not contain any info about L4
@@ -264,16 +264,16 @@
       /// \todo implement request / reply consistency check.
       break;
     case Icmpv6Header::ICMPV6_ERROR_DESTINATION_UNREACHABLE:
-      HandleDestinationUnreachable (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleDestinationUnreachable (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ERROR_PACKET_TOO_BIG:
-      HandlePacketTooBig (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandlePacketTooBig (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ERROR_TIME_EXCEEDED:
-      HandleTimeExceeded (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleTimeExceeded (p, header.GetSource (), header.GetDestination (), interface);
       break;
     case Icmpv6Header::ICMPV6_ERROR_PARAMETER_ERROR:
-      HandleParameterError (p, header.GetSourceAddress (), header.GetDestinationAddress (), interface);
+      HandleParameterError (p, header.GetSource (), header.GetDestination (), interface);
       break;
     default:
       NS_LOG_LOGIC ("Unknown ICMPv6 message type=" << type);
@@ -301,7 +301,7 @@
       if (l4 != 0)
         {
           l4->ReceiveIcmp (source, ipHeader.GetHopLimit (), icmp.GetType (), icmp.GetCode (),
-                           info, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress (), payload);
+                           info, ipHeader.GetSource (), ipHeader.GetDestination (), payload);
         }
     }
 }
@@ -632,8 +632,8 @@
   rs.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + rs.GetSerializedSize (), PROT_NUMBER);
   p->AddHeader (rs);
 
-  ipHeader.SetSourceAddress (src);
-  ipHeader.SetDestinationAddress (dst);
+  ipHeader.SetSource (src);
+  ipHeader.SetDestination (dst);
   ipHeader.SetNextHeader (PROT_NUMBER);
   ipHeader.SetPayloadLength (p->GetSize ());
   ipHeader.SetHopLimit (255);
@@ -654,8 +654,8 @@
   req.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + req.GetSerializedSize (), PROT_NUMBER);
   p->AddHeader (req);
 
-  ipHeader.SetSourceAddress (src);
-  ipHeader.SetDestinationAddress (dst);
+  ipHeader.SetSource (src);
+  ipHeader.SetDestination (dst);
   ipHeader.SetNextHeader (PROT_NUMBER);
   ipHeader.SetPayloadLength (p->GetSize ());
   ipHeader.SetHopLimit (255);
@@ -924,7 +924,7 @@
   origPkt->CopyData (payload, 8);
 
   Ptr<Ipv6L3Protocol> ipv6 = m_node->GetObject<Ipv6L3Protocol> ();
-  ipv6->SetPmtu(ipHeader.GetDestinationAddress(), tooBig.GetMtu ());
+  ipv6->SetPmtu(ipHeader.GetDestination(), tooBig.GetMtu ());
 
   Forward (src, tooBig, tooBig.GetMtu (), ipHeader, payload);
 }
@@ -974,7 +974,7 @@
   Ptr<Ipv6Route> route;
   Ptr<NetDevice> oif (0); //specify non-zero if bound to a source address
 
-  header.SetDestinationAddress (dst);
+  header.SetDestination (dst);
   route = ipv6->GetRoutingProtocol ()->RouteOutput (packet, header, oif, err);
 
   if (route != 0)
@@ -1278,8 +1278,8 @@
   na.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + na.GetSerializedSize (), PROT_NUMBER);
   p->AddHeader (na);
 
-  ipHeader.SetSourceAddress (src);
-  ipHeader.SetDestinationAddress (dst);
+  ipHeader.SetSource (src);
+  ipHeader.SetDestination (dst);
   ipHeader.SetNextHeader (PROT_NUMBER);
   ipHeader.SetPayloadLength (p->GetSize ());
   ipHeader.SetHopLimit (255);
@@ -1301,8 +1301,8 @@
   ns.CalculatePseudoHeaderChecksum (src, dst, p->GetSize () + ns.GetSerializedSize (), PROT_NUMBER);
   p->AddHeader (ns);
 
-  ipHeader.SetSourceAddress (src);
-  ipHeader.SetDestinationAddress (dst);
+  ipHeader.SetSource (src);
+  ipHeader.SetDestination (dst);
   ipHeader.SetNextHeader (PROT_NUMBER);
   ipHeader.SetPayloadLength (p->GetSize ());
   ipHeader.SetHopLimit (255);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv4-interface-address.cc ns-3.35/src/internet/model/ipv4-interface-address.cc
--- ns-3.34/src/internet/model/ipv4-interface-address.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv4-interface-address.cc	2021-10-01 13:26:47.000000000 -0700
@@ -57,18 +57,30 @@
   NS_LOG_FUNCTION (this << &o);
 }
 
-void 
+void
 Ipv4InterfaceAddress::SetLocal (Ipv4Address local)
 {
   NS_LOG_FUNCTION (this << local);
   m_local = local;
 }
 
-Ipv4Address 
+void
+Ipv4InterfaceAddress::SetAddress (Ipv4Address address)
+{
+  SetLocal (address);
+}
+
+Ipv4Address
 Ipv4InterfaceAddress::GetLocal (void) const
 {
   NS_LOG_FUNCTION (this);
-  return m_local; 
+  return m_local;
+}
+
+Ipv4Address
+Ipv4InterfaceAddress::GetAddress (void) const
+{
+  return GetLocal ();
 }
 
 void 
@@ -113,6 +125,16 @@
   return m_scope;
 }
 
+bool Ipv4InterfaceAddress::IsInSameSubnet (const Ipv4Address b) const
+{
+  Ipv4Address aAddr = m_local;
+  aAddr = aAddr.CombineMask(m_mask);
+  Ipv4Address bAddr = b;
+  bAddr = bAddr.CombineMask(m_mask);
+
+  return (aAddr == bAddr);
+}
+
 bool 
 Ipv4InterfaceAddress::IsSecondary (void) const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv4-interface-address.h ns-3.35/src/internet/model/ipv4-interface-address.h
--- ns-3.34/src/internet/model/ipv4-interface-address.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv4-interface-address.h	2021-10-01 13:26:47.000000000 -0700
@@ -70,13 +70,41 @@
   /**
    * \brief Set local address
    * \param local the address
+   *
+   * \note Functionally identical to `Ipv4InterfaceAddress::SetAddress`.
+   *       The method corresponds to the linux variable in_ifaddr.ifa_local
+   *       `Ipv4InterfaceAddress::SetAddress` is to be preferred.
    */
   void SetLocal (Ipv4Address local);
+
+  /**
+   * \brief Set local address
+   * \param address the address
+   *
+   * \note Functially identical to `Ipv4InterfaceAddress::SetLocal`.
+   *       This function is consistent with `Ipv6InterfaceAddress::SetAddress`.
+   */
+  void SetAddress (Ipv4Address address);
+
   /**
    * \brief Get the local address
    * \returns the local address
+   *
+   * \note Functionally identical to `Ipv4InterfaceAddress::GetAddress`.
+   *       The method corresponds to the linux variable in_ifaddr.ifa_local
+   *       `Ipv4InterfaceAddress::GetAddress` is to be preferred.
    */
   Ipv4Address GetLocal (void) const;
+
+  /**
+   * \brief Get the local address
+   * \returns the local address
+   *
+   * \note Functially identical to `Ipv4InterfaceAddress::GetLocal`.
+   *       This function is consistent with `Ipv6InterfaceAddress::GetAddress`.
+   */
+  Ipv4Address GetAddress (void) const;
+
   /**
    * \brief Set the network mask
    * \param mask the network mask
@@ -111,6 +139,13 @@
   Ipv4InterfaceAddress::InterfaceAddressScope_e GetScope (void) const;
 
   /**
+   * \brief Checks if the address is in the same subnet.
+   * \param b the address to check
+   * \return true if the address is in the same subnet.
+   */
+  bool IsInSameSubnet (const Ipv4Address b) const;
+
+  /**
    * \brief Check if the address is a secondary address
    *
    * Secondary address is used for multihoming
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv4-l3-protocol.cc ns-3.35/src/internet/model/ipv4-l3-protocol.cc
--- ns-3.34/src/internet/model/ipv4-l3-protocol.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv4-l3-protocol.cc	2021-10-01 13:26:47.000000000 -0700
@@ -804,6 +804,10 @@
       NS_LOG_LOGIC ("Ipv4L3Protocol::Send case 1b:  passed in with route and valid gateway");
       int32_t interface = GetInterfaceForDevice (route->GetOutputDevice ());
       m_sendOutgoingTrace (ipHeader, packet, interface);
+      if (m_enableDpd && ipHeader.GetDestination ().IsMulticast ())
+        {
+          UpdateDuplicate (packet, ipHeader);
+        }
       SendRealOut (route, packet->Copy (), ipHeader);
       return; 
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-extension.cc ns-3.35/src/internet/model/ipv6-extension.cc
--- ns-3.34/src/internet/model/ipv6-extension.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-extension.cc	2021-10-01 13:26:47.000000000 -0700
@@ -135,7 +135,7 @@
 
             case 2:
               NS_LOG_LOGIC ("Unknown Option. Drop!");
-              icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
+              icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSource (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
               optionLength = 0;
               isDropped = true;
               stopProcessing = true;
@@ -145,9 +145,9 @@
             case 3:
               NS_LOG_LOGIC ("Unknown Option. Drop!");
 
-              if (!ipv6Header.GetDestinationAddress ().IsMulticast ())
+              if (!ipv6Header.GetDestination ().IsMulticast ())
                 {
-                  icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
+                  icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSource (), Icmpv6Header::ICMPV6_UNKNOWN_OPTION, offset + processedSize);
                 }
               optionLength = 0;
               isDropped = true;
@@ -368,7 +368,7 @@
   bool moreFragment = fragmentHeader.GetMoreFragment ();
   uint16_t fragmentOffset = fragmentHeader.GetOffset ();
   uint32_t identification = fragmentHeader.GetIdentification ();
-  Ipv6Address src = ipv6Header.GetSourceAddress ();
+  Ipv6Address src = ipv6Header.GetSource ();
 
   FragmentKey_t fragmentKey = FragmentKey_t (src, identification);
   Ptr<Fragments> fragments;
@@ -608,7 +608,7 @@
       Ptr<Packet> p = packet->Copy ();
       p->AddHeader (ipHeader);
       Ptr<Icmpv6L4Protocol> icmp = GetNode ()->GetObject<Icmpv6L4Protocol> ();
-      icmp->SendErrorTimeExceeded (p, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_FRAGTIME);
+      icmp->SendErrorTimeExceeded (p, ipHeader.GetSource (), Icmpv6Header::ICMPV6_FRAGTIME);
     }
 
   Ptr<Ipv6L3Protocol> ipL3 = GetNode ()->GetObject<Ipv6L3Protocol> ();
@@ -855,7 +855,7 @@
         {
           NS_LOG_LOGIC ("Malformed header. Drop!");
 
-          icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSourceAddress (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
+          icmpv6->SendErrorParameterError (malformedPacket, ipv6Header.GetSource (), Icmpv6Header::ICMPV6_MALFORMED_HEADER, offset + 1);
           dropReason = Ipv6L3Protocol::DROP_MALFORMED_HEADER;
           isDropped = true;
           stopProcessing = true;
@@ -1001,8 +1001,8 @@
 
   Ptr<Icmpv6L4Protocol> icmpv6 = GetNode ()->GetObject<Ipv6L3Protocol> ()->GetIcmpv6 ();
 
-  Ipv6Address srcAddress = ipv6header.GetSourceAddress ();
-  Ipv6Address destAddress = ipv6header.GetDestinationAddress ();
+  Ipv6Address srcAddress = ipv6header.GetSource ();
+  Ipv6Address destAddress = ipv6header.GetDestination ();
   uint8_t hopLimit = ipv6header.GetHopLimit ();
   uint8_t segmentsLeft = routingHeader.GetSegmentsLeft ();
   uint8_t length = (routingHeader.GetLength () >> 3) - 1;
@@ -1049,7 +1049,7 @@
     }
 
   routingHeader.SetRouterAddress (nextAddressIndex, destAddress);
-  ipv6header.SetDestinationAddress (nextAddress);
+  ipv6header.SetDestination (nextAddress);
 
   if (hopLimit <= 1)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-header.cc ns-3.35/src/internet/model/ipv6-header.cc
--- ns-3.34/src/internet/model/ipv6-header.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-header.cc	2021-10-01 13:26:47.000000000 -0700
@@ -38,8 +38,8 @@
     m_nextHeader (0),
     m_hopLimit (0)
 {
-  SetSourceAddress (Ipv6Address ("::"));
-  SetDestinationAddress (Ipv6Address ("::"));
+  SetSource (Ipv6Address ("::"));
+  SetDestination (Ipv6Address ("::"));
 }
 
 void Ipv6Header::SetTrafficClass (uint8_t traffic)
@@ -92,26 +92,46 @@
   return m_hopLimit;
 }
 
-void Ipv6Header::SetSourceAddress (Ipv6Address src)
+void Ipv6Header::SetSource (Ipv6Address src)
 {
   m_sourceAddress = src;
 }
 
-Ipv6Address Ipv6Header::GetSourceAddress () const
+void Ipv6Header::SetSourceAddress (Ipv6Address src)
+{
+  SetSource (src);
+}
+
+Ipv6Address Ipv6Header::GetSource () const
 {
   return m_sourceAddress;
 }
 
-void Ipv6Header::SetDestinationAddress (Ipv6Address dst)
+Ipv6Address Ipv6Header::GetSourceAddress () const
+{
+  return GetSource ();
+}
+
+void Ipv6Header::SetDestination (Ipv6Address dst)
 {
   m_destinationAddress = dst;
 }
 
-Ipv6Address Ipv6Header::GetDestinationAddress () const
+void Ipv6Header::SetDestinationAddress (Ipv6Address dst)
+{
+  SetDestination (dst);
+}
+
+Ipv6Address Ipv6Header::GetDestination () const
 {
   return m_destinationAddress;
 }
 
+Ipv6Address Ipv6Header::GetDestinationAddress () const
+{
+  return GetDestination ();
+}
+
 TypeId Ipv6Header::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::Ipv6Header")
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-header.h ns-3.35/src/internet/model/ipv6-header.h
--- ns-3.34/src/internet/model/ipv6-header.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-header.h	2021-10-01 13:26:47.000000000 -0700
@@ -23,6 +23,7 @@
 
 #include "ns3/header.h"
 #include "ns3/ipv6-address.h"
+#include "ns3/deprecated.h"
 
 namespace ns3 {
 
@@ -226,24 +227,56 @@
    * \brief Set the "Source address" field.
    * \param src the source address
    */
+  void SetSource (Ipv6Address src);
+
+  /**
+   * \brief Set the "Source address" field.
+   * \deprecated Use SetSource () function instead (same functionality)
+   * \param src the source address
+   */
+  NS_DEPRECATED_3_35
   void SetSourceAddress (Ipv6Address src);
 
   /**
    * \brief Get the "Source address" field.
    * \return the source address
    */
+  Ipv6Address GetSource (void) const;
+
+  /**
+   * \brief Get the "Source address" field.
+   * \deprecated Use GetSource () function instead (same functionality)
+   * \return the source address
+   */
+  NS_DEPRECATED_3_35
   Ipv6Address GetSourceAddress (void) const;
 
   /**
    * \brief Set the "Destination address" field.
    * \param dst the destination address
    */
+  void SetDestination (Ipv6Address dst);
+
+  /**
+   * \brief Set the "Destination address" field.
+   * \deprecated Use SetDestination () function instead (same functionality)
+   * \param dst the destination address
+   */
+  NS_DEPRECATED_3_35
   void SetDestinationAddress (Ipv6Address dst);
 
   /**
    * \brief Get the "Destination address" field.
    * \return the destination address
    */
+  Ipv6Address GetDestination (void) const;
+
+  /**
+   * \brief Get the "Destination address" field.
+   * \deprecated Use GetDestination () function instead (same functionality)
+   * \return the destination address
+   */
+  NS_DEPRECATED_3_35
   Ipv6Address GetDestinationAddress (void) const;
 
   /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-l3-protocol.cc ns-3.35/src/internet/model/ipv6-l3-protocol.cc
--- ns-3.34/src/internet/model/ipv6-l3-protocol.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-l3-protocol.cc	2021-10-01 13:26:47.000000000 -0700
@@ -962,7 +962,7 @@
   if (ndiscCache)
     {
       // case one, it's a a direct routing.
-      NdiscCache::Entry *entry = ndiscCache->Lookup (hdr.GetSourceAddress ());
+      NdiscCache::Entry *entry = ndiscCache->Lookup (hdr.GetSource ());
       if (entry)
         {
           entry->UpdateReachableTimer ();
@@ -1003,7 +1003,7 @@
 
       if (ipv6Extension)
         {
-          ipv6Extension->Process (packet, 0, hdr, hdr.GetDestinationAddress (), (uint8_t *)0, stopProcessing, isDropped, dropReason);
+          ipv6Extension->Process (packet, 0, hdr, hdr.GetDestination (), (uint8_t *)0, stopProcessing, isDropped, dropReason);
         }
 
       if (isDropped)
@@ -1017,21 +1017,21 @@
         }
     }
 
-  if (hdr.GetDestinationAddress ().IsAllNodesMulticast ())
+  if (hdr.GetDestination ().IsAllNodesMulticast ())
     {
       LocalDeliver (packet, hdr, interface);
       return;
     }
-  else if (hdr.GetDestinationAddress ().IsAllRoutersMulticast() && ipv6Interface->IsForwarding ())
+  else if (hdr.GetDestination ().IsAllRoutersMulticast() && ipv6Interface->IsForwarding ())
     {
       LocalDeliver (packet, hdr, interface);
       return;
     }
-  else if (hdr.GetDestinationAddress ().IsMulticast ())
+  else if (hdr.GetDestination ().IsMulticast ())
     {
-      bool isSolicited = ipv6Interface->IsSolicitedMulticastAddress (hdr.GetDestinationAddress ());
-      bool isRegisteredOnInterface = IsRegisteredMulticastAddress (hdr.GetDestinationAddress (), interface);
-      bool isRegisteredGlobally = IsRegisteredMulticastAddress (hdr.GetDestinationAddress ());
+      bool isSolicited = ipv6Interface->IsSolicitedMulticastAddress (hdr.GetDestination ());
+      bool isRegisteredOnInterface = IsRegisteredMulticastAddress (hdr.GetDestination (), interface);
+      bool isRegisteredGlobally = IsRegisteredMulticastAddress (hdr.GetDestination ());
       if (isSolicited || isRegisteredGlobally || isRegisteredOnInterface)
         {
           LocalDeliver (packet, hdr, interface);
@@ -1048,7 +1048,7 @@
             {
               Ipv6InterfaceAddress iaddr = GetAddress (j, i);
               Ipv6Address addr = iaddr.GetAddress ();
-              if (addr == hdr.GetDestinationAddress ())
+              if (addr == hdr.GetDestination ())
                 {
                   if (j == interface)
                     {
@@ -1056,7 +1056,7 @@
                     }
                   else
                     {
-                      NS_LOG_LOGIC ("For me (destination " << addr << " match) on another interface " << hdr.GetDestinationAddress ());
+                      NS_LOG_LOGIC ("For me (destination " << addr << " match) on another interface " << hdr.GetDestination ());
                     }
                   LocalDeliver (packet, hdr, interface);
                   return;
@@ -1107,7 +1107,7 @@
   std::list<Ipv6ExtensionFragment::Ipv6PayloadHeaderPair> fragments;
 
   // Check if we have a Path MTU stored. If so, use it. Else, use the link MTU.
-  size_t targetMtu = (size_t)(m_pmtuCache->GetPmtu (ipHeader.GetDestinationAddress()));
+  size_t targetMtu = (size_t)(m_pmtuCache->GetPmtu (ipHeader.GetDestination()));
   if (targetMtu == 0)
     {
       targetMtu = dev->GetMtu ();
@@ -1122,7 +1122,7 @@
         {
           for (uint32_t j=0; j<GetNAddresses(i); j++ )
             {
-              if (GetAddress(i,j).GetAddress() == ipHeader.GetSourceAddress())
+              if (GetAddress(i,j).GetAddress() == ipHeader.GetSource())
                 {
                   fromMe = true;
                   break;
@@ -1135,7 +1135,7 @@
           if ( icmpv6 )
             {
               packet->AddHeader(ipHeader);
-              icmpv6->SendErrorTooBig (packet, ipHeader.GetSourceAddress (), dev->GetMtu ());
+              icmpv6->SendErrorTooBig (packet, ipHeader.GetSource (), dev->GetMtu ());
             }
           return;
         }
@@ -1180,7 +1180,7 @@
     {
       if (outInterface->IsUp ())
         {
-          NS_LOG_LOGIC ("Send to destination " << ipHeader.GetDestinationAddress ());
+          NS_LOG_LOGIC ("Send to destination " << ipHeader.GetDestination ());
 
           if (fragments.size () != 0)
             {
@@ -1189,18 +1189,18 @@
               for (std::list<Ipv6ExtensionFragment::Ipv6PayloadHeaderPair>::const_iterator it = fragments.begin (); it != fragments.end (); it++)
                 {
                   CallTxTrace (it->second, it->first, m_node->GetObject<Ipv6> (), interface);
-                  outInterface->Send (it->first, it->second, ipHeader.GetDestinationAddress ());
+                  outInterface->Send (it->first, it->second, ipHeader.GetDestination ());
                 }
             }
           else
             {
               CallTxTrace (ipHeader, packet, m_node->GetObject<Ipv6> (), interface);
-              outInterface->Send (packet, ipHeader, ipHeader.GetDestinationAddress ());
+              outInterface->Send (packet, ipHeader, ipHeader.GetDestination ());
             }
         }
       else
         {
-          NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << ipHeader.GetDestinationAddress ());
+          NS_LOG_LOGIC ("Dropping-- outgoing interface is down: " << ipHeader.GetDestination ());
           m_dropTrace (ipHeader, packet, DROP_INTERFACE_DOWN, m_node->GetObject<Ipv6> (), interface);
         }
     }
@@ -1212,7 +1212,7 @@
   NS_LOG_LOGIC ("Forwarding logic for node: " << m_node->GetId ());
 
   // Drop RFC 3849 packets: 2001:db8::/32
-  if (header.GetDestinationAddress().IsDocumentation ())
+  if (header.GetDestination().IsDocumentation ())
     {
       NS_LOG_WARN ("Received a packet for 2001:db8::/32 (documentation class).  Drop.");
       m_dropTrace (header, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv6> (), 0);
@@ -1224,7 +1224,7 @@
   Ptr<Packet> packet = p->Copy ();
   ipHeader.SetHopLimit (ipHeader.GetHopLimit () - 1);
 
-  if (ipHeader.GetSourceAddress ().IsLinkLocal ())
+  if (ipHeader.GetSource ().IsLinkLocal ())
     {
       /* no forward for link-local address */
       return;
@@ -1235,10 +1235,10 @@
       NS_LOG_WARN ("TTL exceeded.  Drop.");
       m_dropTrace (ipHeader, packet, DROP_TTL_EXPIRED, m_node->GetObject<Ipv6> (), 0);
       // Do not reply to multicast IPv6 address
-      if (ipHeader.GetDestinationAddress ().IsMulticast () == false)
+      if (ipHeader.GetDestination ().IsMulticast () == false)
         {
           packet->AddHeader (ipHeader);
-          GetIcmpv6 ()->SendErrorTimeExceeded (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_HOPLIMIT);
+          GetIcmpv6 ()->SendErrorTimeExceeded (packet, ipHeader.GetSource (), Icmpv6Header::ICMPV6_HOPLIMIT);
         }
       return;
     }
@@ -1260,8 +1260,8 @@
       NS_LOG_LOGIC ("ICMPv6 redirect!");
       Ptr<Icmpv6L4Protocol> icmpv6 = GetIcmpv6 ();
       Address hardwareTarget;
-      Ipv6Address dst = header.GetDestinationAddress ();
-      Ipv6Address src = header.GetSourceAddress ();
+      Ipv6Address dst = header.GetDestination ();
+      Ipv6Address src = header.GetSource ();
       Ipv6Address target = rtentry->GetGateway ();
       Ptr<Packet> copy = p->Copy ();
 
@@ -1313,8 +1313,8 @@
         }
       NS_LOG_LOGIC ("Forward multicast via interface " << interfaceId);
       Ptr<Ipv6Route> rtentry = Create<Ipv6Route> ();
-      rtentry->SetSource (h.GetSourceAddress ());
-      rtentry->SetDestination (h.GetDestinationAddress ());
+      rtentry->SetSource (h.GetSource ());
+      rtentry->SetDestination (h.GetDestination ());
       rtentry->SetGateway (Ipv6Address::GetAny ());
       rtentry->SetOutputDevice (GetNetDevice (interfaceId));
       SendRealOut (rtentry, packet, h);
@@ -1329,8 +1329,8 @@
   Ptr<IpL4Protocol> protocol = 0;
   Ptr<Ipv6ExtensionDemux> ipv6ExtensionDemux = m_node->GetObject<Ipv6ExtensionDemux> ();
   Ptr<Ipv6Extension> ipv6Extension = 0;
-  Ipv6Address src = ip.GetSourceAddress ();
-  Ipv6Address dst = ip.GetDestinationAddress ();
+  Ipv6Address src = ip.GetSource ();
+  Ipv6Address dst = ip.GetDestination ();
   uint8_t nextHeader = ip.GetNextHeader ();
   uint8_t nextHeaderPosition = 0;
   bool isDropped = false;
@@ -1419,14 +1419,14 @@
                 case IpL4Protocol::RX_ENDPOINT_CLOSED:
                   break;
                 case IpL4Protocol::RX_ENDPOINT_UNREACH:
-                  if (ip.GetDestinationAddress ().IsMulticast ())
+                  if (ip.GetDestination ().IsMulticast ())
                     {
                       /* do not rely on multicast address */
                       break;
                     }
 
                   copy->AddHeader (ip);
-                  GetIcmpv6 ()->SendErrorDestinationUnreachable (copy, ip.GetSourceAddress (), Icmpv6Header::ICMPV6_PORT_UNREACHABLE);
+                  GetIcmpv6 ()->SendErrorDestinationUnreachable (copy, ip.GetSource (), Icmpv6Header::ICMPV6_PORT_UNREACHABLE);
                 }
             }
         }
@@ -1441,11 +1441,11 @@
 
   m_dropTrace (ipHeader, p, DROP_ROUTE_ERROR, m_node->GetObject<Ipv6> (), 0);
 
-  if (!ipHeader.GetDestinationAddress ().IsMulticast ())
+  if (!ipHeader.GetDestination ().IsMulticast ())
     {
       Ptr<Packet> packet = p->Copy ();
       packet->AddHeader (ipHeader);
-      GetIcmpv6 ()->SendErrorDestinationUnreachable (packet, ipHeader.GetSourceAddress (), Icmpv6Header::ICMPV6_NO_ROUTE);
+      GetIcmpv6 ()->SendErrorDestinationUnreachable (packet, ipHeader.GetSource (), Icmpv6Header::ICMPV6_NO_ROUTE);
     }
 }
 
@@ -1454,8 +1454,8 @@
   NS_LOG_FUNCTION (this << src << dst << (uint32_t)protocol << (uint32_t)payloadSize << (uint32_t)ttl << (uint32_t)tclass);
   Ipv6Header hdr;
 
-  hdr.SetSourceAddress (src);
-  hdr.SetDestinationAddress (dst);
+  hdr.SetSource (src);
+  hdr.SetDestination (dst);
   hdr.SetNextHeader (protocol);
   hdr.SetPayloadLength (payloadSize);
   hdr.SetHopLimit (ttl);
@@ -1635,7 +1635,7 @@
       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 ());
+          ndiscCache->GetInterface ()->Send (it->first, it->second, it->second.GetSource ());
         }
       entry->ClearWaitingPacket ();
       entry->StartReachableTimer ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-list-routing.cc ns-3.35/src/internet/model/ipv6-list-routing.cc
--- ns-3.34/src/internet/model/ipv6-list-routing.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-list-routing.cc	2021-10-01 13:26:47.000000000 -0700
@@ -73,14 +73,14 @@
 Ptr<Ipv6Route>
 Ipv6ListRouting::RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, enum Socket::SocketErrno &sockerr)
 {
-  NS_LOG_FUNCTION (this << header.GetDestinationAddress () << header.GetSourceAddress () << oif);
+  NS_LOG_FUNCTION (this << header.GetDestination () << header.GetSource () << oif);
   Ptr<Ipv6Route> route;
 
   for (Ipv6RoutingProtocolList::const_iterator i = m_routingProtocols.begin ();
        i != m_routingProtocols.end (); i++)
     {
       NS_LOG_LOGIC ("Checking protocol " << (*i).second->GetInstanceTypeId () << " with priority " << (*i).first);
-      NS_LOG_LOGIC ("Requesting source address for destination " << header.GetDestinationAddress ());
+      NS_LOG_LOGIC ("Requesting source address for destination " << header.GetDestination ());
       route = (*i).second->RouteOutput (p, header, oif, sockerr);
       if (route)
         {
@@ -107,7 +107,7 @@
   NS_ASSERT (m_ipv6 != 0);
   // Check if input device supports IP
   NS_ASSERT (m_ipv6->GetInterfaceForDevice (idev) >= 0);
-  Ipv6Address dst = header.GetDestinationAddress ();
+  Ipv6Address dst = header.GetDestination ();
 
   // Check if input device supports IP forwarding
   uint32_t iif = m_ipv6->GetInterfaceForDevice (idev);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-queue-disc-item.cc ns-3.35/src/internet/model/ipv6-queue-disc-item.cc
--- ns-3.34/src/internet/model/ipv6-queue-disc-item.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-queue-disc-item.cc	2021-10-01 13:26:47.000000000 -0700
@@ -115,8 +115,8 @@
 {
   NS_LOG_FUNCTION (this << perturbation);
 
-  Ipv6Address src = m_header.GetSourceAddress ();
-  Ipv6Address dest = m_header.GetDestinationAddress ();
+  Ipv6Address src = m_header.GetSource ();
+  Ipv6Address dest = m_header.GetDestination ();
   uint8_t prot = m_header.GetNextHeader ();
 
   TcpHeader tcpHdr;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-raw-socket-impl.cc ns-3.35/src/internet/model/ipv6-raw-socket-impl.cc
--- ns-3.34/src/internet/model/ipv6-raw-socket-impl.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-raw-socket-impl.cc	2021-10-01 13:26:47.000000000 -0700
@@ -242,7 +242,7 @@
   if (ipv6->GetRoutingProtocol ())
     {
       Ipv6Header hdr;
-      hdr.SetDestinationAddress (dst);
+      hdr.SetDestination (dst);
       SocketErrno err = ERROR_NOTERROR;
       Ptr<Ipv6Route> route = 0;
       Ptr<NetDevice> oif = m_boundnetdevice; //specify non-zero if bound to a specific device
@@ -412,8 +412,8 @@
         }
     }
 
-  if ((m_src == Ipv6Address::GetAny () || hdr.GetDestinationAddress () == m_src) && 
-      (m_dst == Ipv6Address::GetAny () || hdr.GetSourceAddress () == m_dst) &&
+  if ((m_src == Ipv6Address::GetAny () || hdr.GetDestination () == m_src) && 
+      (m_dst == Ipv6Address::GetAny () || hdr.GetSource () == m_dst) &&
       hdr.GetNextHeader () == m_protocol)
     {
       Ptr<Packet> copy = p->Copy ();
@@ -437,7 +437,7 @@
         {
           Ipv6PacketInfoTag tag;
           copy->RemovePacketTag (tag);
-          tag.SetAddress (hdr.GetDestinationAddress ());
+          tag.SetAddress (hdr.GetDestination ());
           tag.SetHoplimit (hdr.GetHopLimit ());
           tag.SetTrafficClass (hdr.GetTrafficClass ());
           tag.SetRecvIf (device->GetIfIndex ());
@@ -462,7 +462,7 @@
       copy->AddHeader (hdr);
       Data data;
       data.packet = copy;
-      data.fromIp = hdr.GetSourceAddress ();
+      data.fromIp = hdr.GetSource ();
       data.fromProtocol = hdr.GetNextHeader ();
       m_data.push_back (data);
       NotifyDataRecv ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ipv6-static-routing.cc ns-3.35/src/internet/model/ipv6-static-routing.cc
--- ns-3.34/src/internet/model/ipv6-static-routing.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ipv6-static-routing.cc	2021-10-01 13:26:47.000000000 -0700
@@ -595,7 +595,7 @@
 Ptr<Ipv6Route> Ipv6StaticRouting::RouteOutput (Ptr<Packet> p, const Ipv6Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)
 {
   NS_LOG_FUNCTION (this << header << oif);
-  Ipv6Address destination = header.GetDestinationAddress ();
+  Ipv6Address destination = header.GetDestination ();
   Ptr<Ipv6Route> rtentry = 0;
 
   if (destination.IsMulticast ())
@@ -625,19 +625,19 @@
                                     UnicastForwardCallback ucb, MulticastForwardCallback mcb,
                                     LocalDeliverCallback lcb, ErrorCallback ecb)
 {
-  NS_LOG_FUNCTION (this << p << header << header.GetSourceAddress () << header.GetDestinationAddress () << idev);
+  NS_LOG_FUNCTION (this << p << header << header.GetSource () << header.GetDestination () << idev);
   NS_ASSERT (m_ipv6 != 0);
   // Check if input device supports IP
   NS_ASSERT (m_ipv6->GetInterfaceForDevice (idev) >= 0);
   uint32_t iif = m_ipv6->GetInterfaceForDevice (idev);
-  Ipv6Address dst = header.GetDestinationAddress ();
+  Ipv6Address dst = header.GetDestination ();
 
   // Multicast recognition; handle local delivery here
   if (dst.IsMulticast ())
     {
       NS_LOG_LOGIC ("Multicast destination");
-      Ptr<Ipv6MulticastRoute> mrtentry = LookupStatic (header.GetSourceAddress (),
-                                                       header.GetDestinationAddress (), m_ipv6->GetInterfaceForDevice (idev));
+      Ptr<Ipv6MulticastRoute> mrtentry = LookupStatic (header.GetSource (),
+                                                       header.GetDestination (), m_ipv6->GetInterfaceForDevice (idev));
 
       // \todo check if we want to forward up the packet
       if (mrtentry)
@@ -665,7 +665,7 @@
     }
   // Next, try to find a route
   NS_LOG_LOGIC ("Unicast destination");
-  Ptr<Ipv6Route> rtentry = LookupStatic (header.GetDestinationAddress ());
+  Ptr<Ipv6Route> rtentry = LookupStatic (header.GetDestination ());
 
   if (rtentry != 0)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/ripng.cc ns-3.35/src/internet/model/ripng.cc
--- ns-3.34/src/internet/model/ripng.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/ripng.cc	2021-10-01 13:26:47.000000000 -0700
@@ -183,7 +183,7 @@
 {
   NS_LOG_FUNCTION (this << header << oif);
 
-  Ipv6Address destination = header.GetDestinationAddress ();
+  Ipv6Address destination = header.GetDestination ();
   Ptr<Ipv6Route> rtentry = 0;
 
   if (destination.IsMulticast ())
@@ -213,13 +213,13 @@
                         UnicastForwardCallback ucb, MulticastForwardCallback mcb,
                         LocalDeliverCallback lcb, ErrorCallback ecb)
 {
-  NS_LOG_FUNCTION (this << p << header << header.GetSourceAddress () << header.GetDestinationAddress () << idev);
+  NS_LOG_FUNCTION (this << p << header << header.GetSource () << header.GetDestination () << idev);
 
   NS_ASSERT (m_ipv6 != 0);
   // Check if input device supports IP
   NS_ASSERT (m_ipv6->GetInterfaceForDevice (idev) >= 0);
   uint32_t iif = m_ipv6->GetInterfaceForDevice (idev);
-  Ipv6Address dst = header.GetDestinationAddress ();
+  Ipv6Address dst = header.GetDestination ();
 
   if (dst.IsMulticast ())
     {
@@ -227,8 +227,8 @@
       return false; // Let other routing protocols try to handle this
     }
 
-  if (header.GetDestinationAddress ().IsLinkLocal () ||
-      header.GetSourceAddress ().IsLinkLocal ())
+  if (header.GetDestination ().IsLinkLocal () ||
+      header.GetSource ().IsLinkLocal ())
     {
       NS_LOG_LOGIC ("Dropping packet not for me and with src or dst LinkLocal");
       if (!ecb.IsNull ())
@@ -250,7 +250,7 @@
     }
   // Next, try to find a route
   NS_LOG_LOGIC ("Unicast destination");
-  Ptr<Ipv6Route> rtentry = Lookup (header.GetDestinationAddress ());
+  Ptr<Ipv6Route> rtentry = Lookup (header.GetDestination ());
 
   if (rtentry != 0)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/tcp-cubic.cc ns-3.35/src/internet/model/tcp-cubic.cc
--- ns-3.34/src/internet/model/tcp-cubic.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/tcp-cubic.cc	2021-10-01 13:26:47.000000000 -0700
@@ -397,10 +397,8 @@
 {
   NS_LOG_FUNCTION (this << tcb << bytesInFlight);
 
-  // Without inflation and deflation, these two are the same
-  uint32_t segInFlight = bytesInFlight / tcb->m_segmentSize;
   uint32_t segCwnd = tcb->GetCwndInSegments ();
-  NS_LOG_DEBUG ("Loss at cWnd=" << segCwnd << " in flight=" << segInFlight);
+  NS_LOG_DEBUG ("Loss at cWnd=" << segCwnd << " segments in flight=" << bytesInFlight / tcb->m_segmentSize);
 
   /* Wmax and fast convergence */
   if (segCwnd < m_lastMaxCwnd && m_fastConvergence)
@@ -415,7 +413,7 @@
   m_epochStart = Time::Min ();    // end of epoch
 
   /* Formula taken from the Linux kernel */
-  uint32_t ssThresh = std::max (static_cast<uint32_t> (segInFlight * m_beta ), 2U) * tcb->m_segmentSize;
+  uint32_t ssThresh = std::max (static_cast<uint32_t> (segCwnd * m_beta ), 2U) * tcb->m_segmentSize;
 
   NS_LOG_DEBUG ("SsThresh = " << ssThresh);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/tcp-l4-protocol.cc ns-3.35/src/internet/model/tcp-l4-protocol.cc
--- ns-3.34/src/internet/model/tcp-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/tcp-l4-protocol.cc	2021-10-01 13:26:47.000000000 -0700
@@ -468,8 +468,8 @@
 
           src = Ipv6Address::MakeIpv4MappedAddress (incomingIpHeader.GetSource ());
           dst = Ipv6Address::MakeIpv4MappedAddress (incomingIpHeader.GetDestination ());
-          ipv6Header.SetSourceAddress (src);
-          ipv6Header.SetDestinationAddress (dst);
+          ipv6Header.SetSource (src);
+          ipv6Header.SetDestination (dst);
           return (this->Receive (packet, ipv6Header, fakeInterface));
         }
 
@@ -503,8 +503,8 @@
                         Ipv6Header const &incomingIpHeader,
                         Ptr<Ipv6Interface> interface)
 {
-  NS_LOG_FUNCTION (this << packet << incomingIpHeader.GetSourceAddress () <<
-                   incomingIpHeader.GetDestinationAddress ());
+  NS_LOG_FUNCTION (this << packet << incomingIpHeader.GetSource () <<
+                   incomingIpHeader.GetDestination ());
 
   TcpHeader incomingTcpHeader;
   IpL4Protocol::RxStatus checksumControl;
@@ -514,8 +514,8 @@
   // order to avoid re-calculating TCP checksums for v4-mapped packets?
 
   checksumControl = PacketReceived (packet, incomingTcpHeader,
-                                    incomingIpHeader.GetSourceAddress (),
-                                    incomingIpHeader.GetDestinationAddress ());
+                                    incomingIpHeader.GetSource (),
+                                    incomingIpHeader.GetDestination ());
 
   if (checksumControl != IpL4Protocol::RX_OK)
     {
@@ -523,21 +523,21 @@
     }
 
   Ipv6EndPointDemux::EndPoints endPoints =
-    m_endPoints6->Lookup (incomingIpHeader.GetDestinationAddress (),
+    m_endPoints6->Lookup (incomingIpHeader.GetDestination (),
                           incomingTcpHeader.GetDestinationPort (),
-                          incomingIpHeader.GetSourceAddress (),
+                          incomingIpHeader.GetSource (),
                           incomingTcpHeader.GetSourcePort (), interface);
   if (endPoints.empty ())
     {
       NS_LOG_LOGIC ("TcpL4Protocol " << this << " received a packet but"
                     " no endpoints matched." <<
-                    " destination IP: " << incomingIpHeader.GetDestinationAddress () <<
+                    " destination IP: " << incomingIpHeader.GetDestination () <<
                     " destination port: "<< incomingTcpHeader.GetDestinationPort () <<
-                    " source IP: " << incomingIpHeader.GetSourceAddress () <<
+                    " source IP: " << incomingIpHeader.GetSource () <<
                     " source port: "<< incomingTcpHeader.GetSourcePort ());
 
-      NoEndPointsFound (incomingTcpHeader, incomingIpHeader.GetSourceAddress (),
-                        incomingIpHeader.GetDestinationAddress ());
+      NoEndPointsFound (incomingTcpHeader, incomingIpHeader.GetSource (),
+                        incomingIpHeader.GetDestination ());
 
       return IpL4Protocol::RX_ENDPOINT_CLOSED;
     }
@@ -635,8 +635,8 @@
   if (ipv6 != 0)
     {
       Ipv6Header header;
-      header.SetSourceAddress (saddr);
-      header.SetDestinationAddress (daddr);
+      header.SetSource (saddr);
+      header.SetDestination (daddr);
       header.SetNextHeader (PROT_NUMBER);
       Socket::SocketErrno errno_;
       Ptr<Ipv6Route> route;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/tcp-socket-base.cc ns-3.35/src/internet/model/tcp-socket-base.cc
--- ns-3.34/src/internet/model/tcp-socket-base.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/tcp-socket-base.cc	2021-10-01 13:26:47.000000000 -0700
@@ -1184,8 +1184,8 @@
                 " to " << m_endPoint6->GetLocalAddress () <<
                 ":" << m_endPoint6->GetLocalPort ());
 
-  Address fromAddress = Inet6SocketAddress (header.GetSourceAddress (), port);
-  Address toAddress = Inet6SocketAddress (header.GetDestinationAddress (),
+  Address fromAddress = Inet6SocketAddress (header.GetSource (), port);
+  Address toAddress = Inet6SocketAddress (header.GetDestination (),
                                           m_endPoint6->GetLocalPort ());
 
   TcpHeader tcpHeader;
@@ -2865,7 +2865,7 @@
   // Create a dummy packet, then ask the routing function for the best output
   // interface's address
   Ipv6Header header;
-  header.SetDestinationAddress (m_endPoint6->GetPeerAddress ());
+  header.SetDestination (m_endPoint6->GetPeerAddress ());
   Socket::SocketErrno errno_;
   Ptr<Ipv6Route> route;
   Ptr<NetDevice> oif = m_boundnetdevice;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/tcp-westwood.cc ns-3.35/src/internet/model/tcp-westwood.cc
--- ns-3.34/src/internet/model/tcp-westwood.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/tcp-westwood.cc	2021-10-01 13:26:47.000000000 -0700
@@ -70,7 +70,8 @@
   m_lastSampleBW (0),
   m_lastBW (0),
   m_ackedSegments (0),
-  m_IsCount (false)
+  m_IsCount (false),
+  m_lastAck (0)
 {
   NS_LOG_FUNCTION (this);
 }
@@ -131,8 +132,15 @@
 
   m_currentBW = m_ackedSegments * tcb->m_segmentSize / rtt.GetSeconds ();
 
-  if (m_pType == TcpWestwood::WESTWOODPLUS)
+  if (m_pType == TcpWestwood::WESTWOOD)
+    {
+      Time currentAck = Simulator::Now ();
+      m_currentBW = m_ackedSegments * tcb->m_segmentSize / (currentAck - m_lastAck).GetSeconds ();
+      m_lastAck = currentAck;
+    }
+  else if (m_pType == TcpWestwood::WESTWOODPLUS)
     {
+      m_currentBW = m_ackedSegments * tcb->m_segmentSize / rtt.GetSeconds ();
       m_IsCount = false;
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/tcp-westwood.h ns-3.35/src/internet/model/tcp-westwood.h
--- ns-3.34/src/internet/model/tcp-westwood.h	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/tcp-westwood.h	2021-10-01 13:26:47.000000000 -0700
@@ -133,6 +133,7 @@
   uint32_t               m_ackedSegments;          //!< The number of segments ACKed between RTTs
   bool                   m_IsCount;                //!< Start keeping track of m_ackedSegments for Westwood+ if TRUE
   EventId                m_bwEstimateEvent;        //!< The BW estimation event for Westwood+
+  Time                   m_lastAck;                //!< The last ACK time
 
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/udp-l4-protocol.cc ns-3.35/src/internet/model/udp-l4-protocol.cc
--- ns-3.34/src/internet/model/udp-l4-protocol.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/udp-l4-protocol.cc	2021-10-01 13:26:47.000000000 -0700
@@ -354,8 +354,8 @@
           Ipv6Header ipv6Header;
           Ipv6Address src = Ipv6Address::MakeIpv4MappedAddress (header.GetSource ());
           Ipv6Address dst = Ipv6Address::MakeIpv4MappedAddress (header.GetDestination ());
-          ipv6Header.SetSourceAddress (src);
-          ipv6Header.SetDestinationAddress (dst);
+          ipv6Header.SetSource (src);
+          ipv6Header.SetDestination (dst);
           return (this->Receive (packet, ipv6Header, fakeInterface));
         }
 
@@ -378,27 +378,27 @@
                         Ipv6Header const &header,
                         Ptr<Ipv6Interface> interface)
 {
-  NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << header.GetDestinationAddress ());
+  NS_LOG_FUNCTION (this << packet << header.GetSource () << header.GetDestination ());
   UdpHeader udpHeader;
   if(Node::ChecksumEnabled ())
     {
       udpHeader.EnableChecksums ();
     }
 
-  udpHeader.InitializeChecksum (header.GetSourceAddress (), header.GetDestinationAddress (), PROT_NUMBER);
+  udpHeader.InitializeChecksum (header.GetSource (), header.GetDestination (), PROT_NUMBER);
 
   packet->RemoveHeader (udpHeader);
 
-  if(!udpHeader.IsChecksumOk () && !header.GetSourceAddress ().IsIpv4MappedAddress ())
+  if(!udpHeader.IsChecksumOk () && !header.GetSource ().IsIpv4MappedAddress ())
     {
       NS_LOG_INFO ("Bad checksum : dropping packet!");
       return IpL4Protocol::RX_CSUM_FAILED;
     }
 
-  NS_LOG_DEBUG ("Looking up dst " << header.GetDestinationAddress () << " port " << udpHeader.GetDestinationPort ()); 
+  NS_LOG_DEBUG ("Looking up dst " << header.GetDestination () << " port " << udpHeader.GetDestinationPort ()); 
   Ipv6EndPointDemux::EndPoints endPoints =
-    m_endPoints6->Lookup (header.GetDestinationAddress (), udpHeader.GetDestinationPort (),
-                         header.GetSourceAddress (), udpHeader.GetSourcePort (), interface);
+    m_endPoints6->Lookup (header.GetDestination (), udpHeader.GetDestinationPort (),
+                         header.GetSource (), udpHeader.GetSourcePort (), interface);
   if (endPoints.empty ())
     {
       NS_LOG_LOGIC ("RX_ENDPOINT_UNREACH");
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/model/udp-socket-impl.cc ns-3.35/src/internet/model/udp-socket-impl.cc
--- ns-3.34/src/internet/model/udp-socket-impl.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/model/udp-socket-impl.cc	2021-10-01 13:26:47.000000000 -0700
@@ -750,7 +750,7 @@
   else if (ipv6->GetRoutingProtocol () != 0)
     {
       Ipv6Header header;
-      header.SetDestinationAddress (dest);
+      header.SetDestination (dest);
       header.SetNextHeader (UdpL4Protocol::PROT_NUMBER);
       Socket::SocketErrno errno_;
       Ptr<Ipv6Route> route;
@@ -760,8 +760,8 @@
       if (route != 0)
         {
           NS_LOG_LOGIC ("Route exists");
-          header.SetSourceAddress (route->GetSource ());
-          m_udp->Send (p->Copy (), header.GetSourceAddress (), header.GetDestinationAddress (),
+          header.SetSource (route->GetSource ());
+          m_udp->Send (p->Copy (), header.GetSource (), header.GetDestination (),
                        m_endPoint6->GetLocalPort (), port, route);
           NotifyDataSent (p->GetSize ());
           return p->GetSize ();
@@ -1058,7 +1058,7 @@
 void 
 UdpSocketImpl::ForwardUp6 (Ptr<Packet> packet, Ipv6Header header, uint16_t port, Ptr<Ipv6Interface> incomingInterface)
 {
-  NS_LOG_FUNCTION (this << packet << header.GetSourceAddress () << port);
+  NS_LOG_FUNCTION (this << packet << header.GetSource () << port);
 
   if (m_shutdownRecv)
     {
@@ -1070,7 +1070,7 @@
     {
       Ipv6PacketInfoTag tag;
       packet->RemovePacketTag (tag);
-      tag.SetAddress (header.GetDestinationAddress ());
+      tag.SetAddress (header.GetDestination ());
       tag.SetHoplimit (header.GetHopLimit ());
       tag.SetTrafficClass (header.GetTrafficClass ());
       tag.SetRecvIf (incomingInterface->GetDevice ()->GetIfIndex ());
@@ -1098,7 +1098,7 @@
 
   if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
     {
-      Address address = Inet6SocketAddress (header.GetSourceAddress (), port);
+      Address address = Inet6SocketAddress (header.GetSource (), port);
       m_deliveryQueue.push (std::make_pair (packet, address));
       m_rxAvailable += packet->GetSize ();
       NotifyDataRecv ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet/test/ipv4-deduplication-test.cc ns-3.35/src/internet/test/ipv4-deduplication-test.cc
--- ns-3.34/src/internet/test/ipv4-deduplication-test.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet/test/ipv4-deduplication-test.cc	2021-10-01 13:26:47.000000000 -0700
@@ -424,6 +424,11 @@
     std::map <std::string, uint32_t> packets = {
       {"A", 14}, {"B", 16}, {"C", 16}, {"D", 16}, {"E", 4}
     };
+
+    // a priori determined packet receptions based on
+    std:: map <std::string, uint32_t> packetsDuped = {
+      {"A", 0}, {"B", 1}, {"C", 1}, {"D", 1}, {"E", 1}
+    };
     // a priori determined packet receptions based on initial TTL of 4, degenerate de-dup
     // There are TTL (4) rounds of packets.  Each round a node will register a
     // received packet if another connected node transmits.  A misses the 1st round
@@ -433,12 +438,10 @@
       {"A", 3}, {"B", 4}, {"C", 4}, {"D", 3}, {"E", 2}
     };
 
-    NS_TEST_ASSERT_MSG_NE ((m_packetCountMap.find (name) == m_packetCountMap.end ()), true,
-                          "No packets received for node " << name);
     switch (m_mode)
       {
         case ENABLED:
-          NS_TEST_EXPECT_MSG_EQ (m_packetCountMap[name], 1, "Wrong number of packets received for node " << name);
+          NS_TEST_ASSERT_MSG_EQ (m_packetCountMap[name], packetsDuped[name], "Wrong number of packets received for node " << name);
           break;
         case DISABLED:
           NS_TEST_EXPECT_MSG_EQ (m_packetCountMap[name],  packets[name], "Wrong number of packets received for node " << name);
@@ -457,10 +460,10 @@
       {
         case ENABLED:
           // a priori determined packet drops based on initial TTL of 4, enabled de-dup;
-          // A hears from B & C
+          // A hears from B & C -- > 2 drops
           // D hears from B, C, AND E
-          // B (C) hears from A, C (B), D, and A again
-          drops = {{"A", 1}, {"B", 3}, {"C", 3}, {"D", 2}, {"E", 0}};
+          // B (C) hears from A, C (B), D,
+          drops = {{"A", 2}, {"B", 2}, {"C", 2}, {"D", 2}, {"E", 0}};
           break;
         case DISABLED:
           // a priori determined packet drops based on initial TTL of 4, disabled de-dup
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet-apps/bindings/modulegen__gcc_ILP32.py ns-3.35/src/internet-apps/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/internet-apps/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet-apps/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1905,11 +1905,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1982,6 +1977,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -2002,11 +2002,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2127,11 +2136,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2248,11 +2252,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2516,11 +2515,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4095,11 +4089,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4140,11 +4139,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4165,10 +4169,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4193,10 +4202,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet-apps/bindings/modulegen__gcc_LP64.py ns-3.35/src/internet-apps/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/internet-apps/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet-apps/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1905,11 +1905,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1982,6 +1977,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -2002,11 +2002,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2127,11 +2136,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2248,11 +2252,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2516,11 +2515,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4095,11 +4089,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4140,11 +4139,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4165,10 +4169,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4193,10 +4202,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet-apps/model/radvd.cc ns-3.35/src/internet-apps/model/radvd.cc
--- ns-3.34/src/internet-apps/model/radvd.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet-apps/model/radvd.cc	2021-10-01 13:26:47.000000000 -0700
@@ -315,7 +315,7 @@
             {
             case Icmpv6Header::ICMPV6_ND_ROUTER_SOLICITATION:
               packet->RemoveHeader (rsHdr);
-              NS_LOG_INFO ("Received ICMPv6 Router Solicitation from " << hdr.GetSourceAddress () << " code = " << (uint32_t)rsHdr.GetCode ());
+              NS_LOG_INFO ("Received ICMPv6 Router Solicitation from " << hdr.GetSource () << " code = " << (uint32_t)rsHdr.GetCode ());
 
               for (RadvdInterfaceListCI it = m_configurations.begin (); it != m_configurations.end (); it++)
                 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/internet-apps/test/ipv6-radvd-test.cc ns-3.35/src/internet-apps/test/ipv6-radvd-test.cc
--- ns-3.34/src/internet-apps/test/ipv6-radvd-test.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/internet-apps/test/ipv6-radvd-test.cc	2021-10-01 13:26:47.000000000 -0700
@@ -112,29 +112,29 @@
   Ptr<Ipv6Route> route;
 
   ipv6 = n0Dev->GetNode ()->GetObject<Ipv6L3Protocol> ();
-  ipHdr.SetSourceAddress (m_addresses[0]);
-  ipHdr.SetDestinationAddress (m_addresses[1]);
+  ipHdr.SetSource (m_addresses[0]);
+  ipHdr.SetDestination (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]);
+  ipHdr.SetSource (m_addresses[1]);
+  ipHdr.SetDestination (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]);
+  ipHdr.SetSource (m_addresses[2]);
+  ipHdr.SetDestination (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]);
+  ipHdr.SetSource (m_addresses[3]);
+  ipHdr.SetDestination (m_addresses[2]);
   route = ipv6->GetRoutingProtocol ()->RouteOutput (p, ipHdr, n1Dev, sockerr);
   m_routingResults.push_back (sockerr);
   m_routes.push_back (route);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lr-wpan/bindings/modulegen__gcc_ILP32.py ns-3.35/src/lr-wpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lr-wpan/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1880,11 +1880,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1989,11 +1984,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2110,11 +2100,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2307,11 +2292,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lr-wpan/bindings/modulegen__gcc_LP64.py ns-3.35/src/lr-wpan/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lr-wpan/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1880,11 +1880,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1989,11 +1984,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2110,11 +2100,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2307,11 +2292,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lr-wpan/test/lr-wpan-packet-test.cc ns-3.35/src/lr-wpan/test/lr-wpan-packet-test.cc
--- ns-3.34/src/lr-wpan/test/lr-wpan-packet-test.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lr-wpan/test/lr-wpan-packet-test.cc	2021-10-01 13:26:47.000000000 -0700
@@ -24,6 +24,7 @@
 #include <ns3/mac16-address.h>
 #include <ns3/mac64-address.h>
 #include <ns3/log.h>
+#include <vector>
 
 
 using namespace ns3;
@@ -84,9 +85,9 @@
 
   // Test serialization and deserialization
   uint32_t size = p->GetSerializedSize ();
-  uint8_t buffer[size];
-  p->Serialize (buffer, size);
-  Ptr<Packet> p2 = Create<Packet> (buffer, size, true);
+  std::vector<uint8_t> buffer (size);
+  p->Serialize (buffer.data (), size);
+  Ptr<Packet> p2 = Create<Packet> (buffer.data (), size, true);
 
 
   p2->Print (std::cout);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/bindings/modulegen__gcc_ILP32.py ns-3.35/src/lte/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/lte/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lte/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1915,7 +1915,7 @@
     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')
     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< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::map< unsigned char, ns3::ComponentCarrier >', ('unsigned char', 'ns3::ComponentCarrier'), container_type='map')
     module.add_container('std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 'ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified', container_type='list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
@@ -5850,11 +5850,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -5952,6 +5947,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -5972,11 +5972,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -6097,11 +6106,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -6218,11 +6222,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -6603,11 +6602,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -11070,6 +11064,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -11097,6 +11096,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -13606,10 +13610,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -21829,6 +21833,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -21863,6 +21872,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/bindings/modulegen__gcc_LP64.py ns-3.35/src/lte/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/lte/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lte/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1915,7 +1915,7 @@
     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')
     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< ns3::BandInfo >', 'ns3::BandInfo', container_type='vector')
     module.add_container('std::map< unsigned char, ns3::ComponentCarrier >', ('unsigned char', 'ns3::ComponentCarrier'), container_type='map')
     module.add_container('std::list< ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified >', 'ns3::GtpcModifyBearerRequestMessage::BearerContextToBeModified', container_type='list')
     module.add_container('std::map< unsigned int, unsigned int >', ('unsigned int', 'unsigned int'), container_type='map')
@@ -5850,11 +5850,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -5952,6 +5947,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -5972,11 +5972,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -6097,11 +6106,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -6218,11 +6222,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -6603,11 +6602,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -11070,6 +11064,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -11097,6 +11096,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -13606,10 +13610,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -21829,6 +21833,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -21863,6 +21872,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/model/epc-pgw-application.cc ns-3.35/src/lte/model/epc-pgw-application.cc
--- ns-3.34/src/lte/model/epc-pgw-application.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lte/model/epc-pgw-application.cc	2021-10-01 13:26:47.000000000 -0700
@@ -197,7 +197,7 @@
     {
       Ipv6Header ipv6Header;
       packet->PeekHeader (ipv6Header);
-      Ipv6Address ueAddr =  ipv6Header.GetDestinationAddress ();
+      Ipv6Address ueAddr =  ipv6Header.GetDestination ();
       NS_LOG_LOGIC ("packet addressed to UE " << ueAddr);
 
       // find corresponding UeInfo address
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/model/epc-tft-classifier.cc ns-3.35/src/lte/model/epc-tft-classifier.cc
--- ns-3.34/src/lte/model/epc-tft-classifier.cc	2021-07-14 10:31:06.000000000 -0700
+++ ns-3.35/src/lte/model/epc-tft-classifier.cc	2021-10-01 13:26:47.000000000 -0700
@@ -206,14 +206,14 @@
 
       if (direction ==  EpcTft::UPLINK)
         {
-          localAddressIpv6 = ipv6Header.GetSourceAddress ();
-          remoteAddressIpv6 = ipv6Header.GetDestinationAddress ();
+          localAddressIpv6 = ipv6Header.GetSource ();
+          remoteAddressIpv6 = ipv6Header.GetDestination ();
         }
       else
         {
           NS_ASSERT (direction ==  EpcTft::DOWNLINK);
-          remoteAddressIpv6 = ipv6Header.GetSourceAddress ();
-          localAddressIpv6 = ipv6Header.GetDestinationAddress ();
+          remoteAddressIpv6 = ipv6Header.GetSource ();
+          localAddressIpv6 = ipv6Header.GetDestination ();
         }
       NS_LOG_INFO ("local address: " << localAddressIpv6 << " remote address: " << remoteAddressIpv6);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/model/lte-amc.cc ns-3.35/src/lte/model/lte-amc.cc
--- ns-3.34/src/lte/model/lte-amc.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/lte/model/lte-amc.cc	2021-10-01 13:26:47.000000000 -0700
@@ -297,7 +297,7 @@
   NS_LOG_FUNCTION (mcs);
 
   NS_ASSERT_MSG (mcs < 29, "MCS=" << mcs);
-  NS_ASSERT_MSG (nprb < 111, "NPRB=" << nprb);
+  NS_ASSERT_MSG (nprb > 0 && nprb < 111, "NPRB=" << nprb);
 
   int itbs = McsToItbsDl[mcs];
   return (TransportBlockSizeTable[nprb - 1][itbs]);
@@ -309,7 +309,7 @@
   NS_LOG_FUNCTION (mcs);
 
   NS_ASSERT_MSG (mcs < 29, "MCS=" << mcs);
-  NS_ASSERT_MSG (nprb < 111, "NPRB=" << nprb);
+  NS_ASSERT_MSG (nprb > 0 && nprb < 111, "NPRB=" << nprb);
 
   int itbs = McsToItbsUl[mcs];
   return (TransportBlockSizeTable[nprb - 1][itbs]);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/model/tdmt-ff-mac-scheduler.cc ns-3.35/src/lte/model/tdmt-ff-mac-scheduler.cc
--- ns-3.34/src/lte/model/tdmt-ff-mac-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/lte/model/tdmt-ff-mac-scheduler.cc	2021-10-01 13:26:47.000000000 -0700
@@ -942,8 +942,10 @@
             } // end for RBG free
 
         } // end for RBGs
-
-      allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax), tempMap));
+      if (tempMap.size() > 0)
+        {
+          allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax), tempMap));
+        }
     }
 
   // generate the transmission opportunities by grouping the RBGs of the same RNTI and
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/model/tdtbfq-ff-mac-scheduler.cc ns-3.35/src/lte/model/tdtbfq-ff-mac-scheduler.cc
--- ns-3.34/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/lte/model/tdtbfq-ff-mac-scheduler.cc	2021-10-01 13:26:47.000000000 -0700
@@ -1079,7 +1079,10 @@
           tempMap.push_back (i);
           rbgMap.at (i) = true;
         }
-      allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
+      if (tempMap.size() > 0)
+        {
+          allocationMap.insert (std::pair <uint16_t, std::vector <uint16_t> > ((*itMax).first, tempMap));
+        }
     }
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/test/lte-test-ipv6-routing.cc ns-3.35/src/lte/test/lte-test-ipv6-routing.cc
--- ns-3.34/src/lte/test/lte-test-ipv6-routing.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/lte/test/lte-test-ipv6-routing.cc	2021-10-01 13:26:47.000000000 -0700
@@ -176,8 +176,8 @@
           Ptr<Packet> p2 = (*it2)->Copy ();
           Ipv6Header ipv6header2;
           p2->RemoveHeader (ipv6header2);
-          Ipv6Address sorceAddress = ipv6header2.GetSourceAddress ();
-          Ipv6Address destinationAddress = ipv6header2.GetDestinationAddress ();
+          Ipv6Address sorceAddress = ipv6header2.GetSource ();
+          Ipv6Address destinationAddress = ipv6header2.GetDestination ();
           UdpHeader udpHeader2;
           p2->RemoveHeader (udpHeader2);
           uint16_t sourcePort;
@@ -186,8 +186,8 @@
           destinationPort = udpHeader2.GetDestinationPort ();
           //Check whether the uids, addresses and ports match
           if ((p2->GetUid () == p1->GetUid ())
-              && sorceAddress == ipv6header1.GetDestinationAddress ()
-              && destinationAddress == ipv6header1.GetSourceAddress ()
+              && sorceAddress == ipv6header1.GetDestination ()
+              && destinationAddress == ipv6header1.GetSource ()
               && sourcePort == udpHeader1.GetDestinationPort ()
               && destinationPort == udpHeader1.GetSourcePort ())
             {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/lte/test/test-epc-tft-classifier.cc ns-3.35/src/lte/test/test-epc-tft-classifier.cc
--- ns-3.34/src/lte/test/test-epc-tft-classifier.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/lte/test/test-epc-tft-classifier.cc	2021-10-01 13:26:47.000000000 -0700
@@ -133,8 +133,8 @@
 
   if (m_useIpv6)
     {
-      m_ipv6Header.SetSourceAddress (Ipv6Address::MakeIpv4MappedAddress (Ipv4Address (sa.c_str ())));
-      m_ipv6Header.SetDestinationAddress (Ipv6Address::MakeIpv4MappedAddress (Ipv4Address (da.c_str ())));
+      m_ipv6Header.SetSource (Ipv6Address::MakeIpv4MappedAddress (Ipv4Address (sa.c_str ())));
+      m_ipv6Header.SetDestination (Ipv6Address::MakeIpv4MappedAddress (Ipv4Address (da.c_str ())));
       m_ipv6Header.SetTrafficClass (tos);
       m_ipv6Header.SetPayloadLength (8); // Full UDP header
       m_ipv6Header.SetNextHeader (UdpL4Protocol::PROT_NUMBER);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mesh/bindings/modulegen__gcc_ILP32.py ns-3.35/src/mesh/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/mesh/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mesh/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -23,13 +23,13 @@
     ## 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')
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], 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')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], 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]
@@ -41,7 +41,7 @@
     ## 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_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_80211p', '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]
@@ -408,8 +408,6 @@
     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&')
@@ -423,12 +421,12 @@
     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]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -451,6 +449,9 @@
     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('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::DroppedOldMpdu')
+    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::DroppedOldMpdu*')
+    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::DroppedOldMpdu&')
     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&')
@@ -537,6 +538,8 @@
     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'])
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet [class]
+    module.add_class('MuEdcaParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## 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]
@@ -688,9 +691,8 @@
     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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     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')
@@ -1066,7 +1068,6 @@
     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'])
@@ -1113,6 +1114,7 @@
     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_Ns3MuEdcaParameterSet_methods(root_module, root_module['ns3::MuEdcaParameterSet'])
     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'])
@@ -2422,11 +2424,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2531,11 +2528,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2652,11 +2644,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2849,11 +2836,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4303,6 +4285,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -5054,6 +5038,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtAssocResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5128,6 +5117,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
     cls.add_method('SetStatusCode', 
                    'void', 
@@ -5361,6 +5354,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtProbeResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5445,6 +5443,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSsid(ns3::Ssid ssid) [member function]
     cls.add_method('SetSsid', 
                    'void', 
@@ -5823,6 +5825,8 @@
 def register_Ns3Txop_methods(root_module, cls):
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
     ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -5833,19 +5837,14 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## 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', 
                    [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', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
     cls.add_method('SetTxMiddle', 
@@ -5881,17 +5880,17 @@
     cls.add_method('GetMinCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
                    [], 
-                   is_const=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)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
     cls.add_method('GetTxopLimit', 
                    'ns3::Time', 
@@ -5975,11 +5974,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
@@ -6838,9 +6832,14 @@
                    '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 &', 
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
+    cls.add_method('GetQueueAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
+    cls.add_method('GetQueueIterator', 
+                   'ns3::WifiMacQueueItem::ConstIterator', 
                    [], 
                    is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
@@ -6858,6 +6857,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
+    cls.add_method('IsInFlight', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
     cls.add_method('IsQueued', 
                    'bool', 
@@ -6868,6 +6872,14 @@
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
+    cls.add_method('ResetInFlight', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
+    cls.add_method('SetInFlight', 
+                   'void', 
+                   [])
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
                    'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
@@ -6878,17 +6890,6 @@
                    [])
     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', 
@@ -6933,6 +6934,10 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -7080,6 +7085,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
@@ -7675,10 +7685,6 @@
                    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', 
@@ -7689,10 +7695,10 @@
                    'bool', 
                    [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]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
     cls.add_method('CreateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('DestroyAgreement', 
                    'void', 
@@ -7709,10 +7715,6 @@
     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', 
-                   [])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyGotAck', 
                    'void', 
@@ -7721,18 +7723,14 @@
     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, 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]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [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')])
+                   'std::pair< unsigned short, unsigned short >', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), 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::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::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', 
@@ -7758,10 +7756,6 @@
     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', 
@@ -7814,6 +7808,10 @@
     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::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
+    cls.add_method('SetDroppedOldMpduCallback', 
+                   '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', 
@@ -7827,6 +7825,11 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3BooleanChecker_methods(root_module, cls):
@@ -9851,6 +9854,98 @@
                    is_static=True)
     return
 
+def register_Ns3MuEdcaParameterSet_methods(root_module, cls):
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet(ns3::MuEdcaParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MuEdcaParameterSet const &', 'arg0')])
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet() [constructor]
+    cls.add_constructor([])
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetMuAifsn(uint8_t aci) const [member function]
+    cls.add_method('GetMuAifsn', 
+                   'uint8_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMax(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMax', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMin(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMin', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Time ns3::MuEdcaParameterSet::GetMuEdcaTimer(uint8_t aci) const [member function]
+    cls.add_method('GetMuEdcaTimer', 
+                   'ns3::Time', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetQosInfo() const [member function]
+    cls.add_method('GetQosInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): bool ns3::MuEdcaParameterSet::IsPresent() const [member function]
+    cls.add_method('IsPresent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuAifsn(uint8_t aci, uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint8_t', 'aifsn')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMax(uint8_t aci, uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMax')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMin(uint8_t aci, uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMin')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuEdcaTimer(uint8_t aci, ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('ns3::Time', 'timer')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
+    cls.add_method('SetQosInfo', 
+                   'void', 
+                   [param('uint8_t', 'qosInfo')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -10360,33 +10455,18 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
-    cls.add_constructor([])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
     cls.add_method('IsQosTxop', 
                    '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', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    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::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
     cls.add_method('NotifyChannelAccessed', 
                    'void', 
@@ -10406,6 +10486,11 @@
     cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
                    [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
     cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
@@ -10465,10 +10550,6 @@
     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', 
-                   [param('ns3::AcIndex', 'ac')])
     ## 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', 
@@ -10525,23 +10606,24 @@
     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]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator 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]
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', '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::ConstIterator & 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')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', '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::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('SetQosQueueSize', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
     cls.add_method('IsTxopStarted', 
                    'bool', 
@@ -10552,6 +10634,51 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint16_t', 'cwMin')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint16_t', 'cwMax')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('ns3::Time', 'timer')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
+    cls.add_method('StartMuEdcaTimerNow', 
+                   'void', 
+                   [])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
+    cls.add_method('MuEdcaTimerRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
+    cls.add_method('EdcaDisabled', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
+                   [], 
+                   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]
@@ -10707,6 +10834,41 @@
                    'ns3::Ptr< ns3::QosTxop >', 
                    [param('uint8_t', 'tid')], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -10727,6 +10889,16 @@
                    'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -10787,51 +10959,21 @@
                    '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')
     ## 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', 
-                   [], 
-                   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('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, 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, 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_Ns3Ssid_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mesh/bindings/modulegen__gcc_LP64.py ns-3.35/src/mesh/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/mesh/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mesh/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -23,13 +23,13 @@
     ## 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')
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], 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')
+    ## qos-utils.h (module 'wifi'): ns3::AcIndex [enumeration]
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', 'AC_UNDEF'], 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]
@@ -41,7 +41,7 @@
     ## 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_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_80211p', '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]
@@ -408,8 +408,6 @@
     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&')
@@ -423,12 +421,12 @@
     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]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -451,6 +449,9 @@
     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('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::DroppedOldMpdu')
+    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::DroppedOldMpdu*')
+    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::DroppedOldMpdu&')
     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&')
@@ -537,6 +538,8 @@
     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'])
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet [class]
+    module.add_class('MuEdcaParameterSet', import_from_module='ns.wifi', parent=root_module['ns3::WifiInformationElement'])
     ## 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]
@@ -688,9 +691,8 @@
     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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     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')
@@ -1066,7 +1068,6 @@
     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'])
@@ -1113,6 +1114,7 @@
     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_Ns3MuEdcaParameterSet_methods(root_module, root_module['ns3::MuEdcaParameterSet'])
     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'])
@@ -2422,11 +2424,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2531,11 +2528,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2652,11 +2644,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2849,11 +2836,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4303,6 +4285,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -5054,6 +5038,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtAssocResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5128,6 +5117,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
     cls.add_method('SetStatusCode', 
                    'void', 
@@ -5361,6 +5354,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtProbeResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -5445,6 +5443,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSsid(ns3::Ssid ssid) [member function]
     cls.add_method('SetSsid', 
                    'void', 
@@ -5823,6 +5825,8 @@
 def register_Ns3Txop_methods(root_module, cls):
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
     ## txop.h (module 'wifi'): static ns3::TypeId ns3::Txop::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -5833,19 +5837,14 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
-    ## 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', 
                    [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', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::SetTxMiddle(ns3::Ptr<ns3::MacTxMiddle> const txMiddle) [member function]
     cls.add_method('SetTxMiddle', 
@@ -5881,17 +5880,17 @@
     cls.add_method('GetMinCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
                    [], 
-                   is_const=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)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
     cls.add_method('GetTxopLimit', 
                    'ns3::Time', 
@@ -5975,11 +5974,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): bool ns3::Txop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
@@ -6838,9 +6832,14 @@
                    '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 &', 
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
+    cls.add_method('GetQueueAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
+    cls.add_method('GetQueueIterator', 
+                   'ns3::WifiMacQueueItem::ConstIterator', 
                    [], 
                    is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
@@ -6858,6 +6857,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
+    cls.add_method('IsInFlight', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
     cls.add_method('IsQueued', 
                    'bool', 
@@ -6868,6 +6872,14 @@
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
+    cls.add_method('ResetInFlight', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
+    cls.add_method('SetInFlight', 
+                   'void', 
+                   [])
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
                    'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
@@ -6878,17 +6890,6 @@
                    [])
     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', 
@@ -6933,6 +6934,10 @@
     cls.add_method('SetFragmentationThreshold', 
                    'void', 
                    [param('uint32_t', 'threshold')])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetQosSupport(ns3::Mac48Address from, bool qosSupported) [member function]
     cls.add_method('SetQosSupport', 
                    'void', 
@@ -7080,6 +7085,11 @@
                    'bool', 
                    [param('ns3::Mac48Address', 'address')], 
                    is_const=True)
+    ## wifi-remote-station-manager.h (module 'wifi'): uint16_t ns3::WifiRemoteStationManager::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   is_const=True)
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::AddBasicMcs(ns3::WifiMode mcs) [member function]
     cls.add_method('AddBasicMcs', 
                    'void', 
@@ -7675,10 +7685,6 @@
                    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', 
@@ -7689,10 +7695,10 @@
                    'bool', 
                    [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]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
     cls.add_method('CreateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('DestroyAgreement', 
                    'void', 
@@ -7709,10 +7715,6 @@
     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', 
-                   [])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyGotAck', 
                    'void', 
@@ -7721,18 +7723,14 @@
     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, 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]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [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')])
+                   'std::pair< unsigned short, unsigned short >', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), 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::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::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', 
@@ -7758,10 +7756,6 @@
     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', 
@@ -7814,6 +7808,10 @@
     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::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
+    cls.add_method('SetDroppedOldMpduCallback', 
+                   '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', 
@@ -7827,6 +7825,11 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3BooleanChecker_methods(root_module, cls):
@@ -9851,6 +9854,98 @@
                    is_static=True)
     return
 
+def register_Ns3MuEdcaParameterSet_methods(root_module, cls):
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet(ns3::MuEdcaParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MuEdcaParameterSet const &', 'arg0')])
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet() [constructor]
+    cls.add_constructor([])
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetMuAifsn(uint8_t aci) const [member function]
+    cls.add_method('GetMuAifsn', 
+                   'uint8_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMax(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMax', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMin(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMin', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Time ns3::MuEdcaParameterSet::GetMuEdcaTimer(uint8_t aci) const [member function]
+    cls.add_method('GetMuEdcaTimer', 
+                   'ns3::Time', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetQosInfo() const [member function]
+    cls.add_method('GetQosInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): bool ns3::MuEdcaParameterSet::IsPresent() const [member function]
+    cls.add_method('IsPresent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuAifsn(uint8_t aci, uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint8_t', 'aifsn')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMax(uint8_t aci, uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMax')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMin(uint8_t aci, uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMin')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuEdcaTimer(uint8_t aci, ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('ns3::Time', 'timer')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
+    cls.add_method('SetQosInfo', 
+                   'void', 
+                   [param('uint8_t', 'qosInfo')])
+    return
+
 def register_Ns3NetDevice_methods(root_module, cls):
     ## net-device.h (module 'network'): ns3::NetDevice::NetDevice() [constructor]
     cls.add_constructor([])
@@ -10360,33 +10455,18 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
-    cls.add_constructor([])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
     cls.add_method('IsQosTxop', 
                    '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', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    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::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
     cls.add_method('NotifyChannelAccessed', 
                    'void', 
@@ -10406,6 +10486,11 @@
     cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
                    [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
     cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
@@ -10465,10 +10550,6 @@
     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', 
-                   [param('ns3::AcIndex', 'ac')])
     ## 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', 
@@ -10525,23 +10606,24 @@
     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]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator 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]
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', '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::ConstIterator & 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')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', '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::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('SetQosQueueSize', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
     cls.add_method('IsTxopStarted', 
                    'bool', 
@@ -10552,6 +10634,51 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint16_t', 'cwMin')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint16_t', 'cwMax')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('ns3::Time', 'timer')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
+    cls.add_method('StartMuEdcaTimerNow', 
+                   'void', 
+                   [])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
+    cls.add_method('MuEdcaTimerRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
+    cls.add_method('EdcaDisabled', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
+                   [], 
+                   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]
@@ -10707,6 +10834,41 @@
                    'ns3::Ptr< ns3::QosTxop >', 
                    [param('uint8_t', 'tid')], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -10727,6 +10889,16 @@
                    'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -10787,51 +10959,21 @@
                    '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')
     ## 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', 
-                   [], 
-                   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('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, 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, 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_Ns3Ssid_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mesh/model/mesh-wifi-interface-mac.cc ns-3.35/src/mesh/model/mesh-wifi-interface-mac.cc
--- ns-3.34/src/mesh/model/mesh-wifi-interface-mac.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mesh/model/mesh-wifi-interface-mac.cc	2021-10-01 13:26:47.000000000 -0700
@@ -540,6 +540,7 @@
 void
 MeshWifiInterfaceMac::ConfigureStandard (enum WifiStandard standard)
 {
+  SetQosSupported (true);  // a mesh station is a QoS station
   RegularWifiMac::ConfigureStandard (standard);
   m_standard = standard;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/bindings/modulegen__gcc_ILP32.py ns-3.35/src/mobility/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/mobility/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -79,6 +79,8 @@
     module.add_class('GeographicPositions')
     ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::EarthSpheroidType [enumeration]
     module.add_enum('EarthSpheroidType', ['SPHERE', 'GRS80', 'WGS84'], outer_class=root_module['ns3::GeographicPositions'])
+    ## group-mobility-helper.h (module 'mobility'): ns3::GroupMobilityHelper [class]
+    module.add_class('GroupMobilityHelper')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -529,6 +531,7 @@
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3GeographicPositions_methods(root_module, root_module['ns3::GeographicPositions'])
+    register_Ns3GroupMobilityHelper_methods(root_module, root_module['ns3::GroupMobilityHelper'])
     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'])
@@ -1433,6 +1436,57 @@
                    is_static=True)
     return
 
+def register_Ns3GroupMobilityHelper_methods(root_module, cls):
+    ## group-mobility-helper.h (module 'mobility'): ns3::GroupMobilityHelper::GroupMobilityHelper(ns3::GroupMobilityHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::GroupMobilityHelper const &', 'arg0')])
+    ## group-mobility-helper.h (module 'mobility'): ns3::GroupMobilityHelper::GroupMobilityHelper() [constructor]
+    cls.add_constructor([])
+    ## group-mobility-helper.h (module 'mobility'): int64_t ns3::GroupMobilityHelper::AssignStreams(ns3::NodeContainer c, int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('ns3::NodeContainer', 'c'), param('int64_t', 'stream')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::Install(std::string nodeName) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::Install(ns3::NodeContainer container) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer', 'container')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetMemberMobilityModel(std::string type, 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()) [member function]
+    cls.add_method('SetMemberMobilityModel', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetMemberPositionAllocator(ns3::Ptr<ns3::PositionAllocator> allocator) [member function]
+    cls.add_method('SetMemberPositionAllocator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PositionAllocator >', 'allocator')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetMemberPositionAllocator(std::string type, 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()) [member function]
+    cls.add_method('SetMemberPositionAllocator', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferenceMobilityModel(ns3::Ptr<ns3::MobilityModel> mobility) [member function]
+    cls.add_method('SetReferenceMobilityModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'mobility')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferenceMobilityModel(std::string type, 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()) [member function]
+    cls.add_method('SetReferenceMobilityModel', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferencePositionAllocator(ns3::Ptr<ns3::PositionAllocator> allocator) [member function]
+    cls.add_method('SetReferencePositionAllocator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PositionAllocator >', 'allocator')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferencePositionAllocator(std::string type, 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()) [member function]
+    cls.add_method('SetReferencePositionAllocator', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    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')])
@@ -1530,11 +1584,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1639,11 +1688,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1760,11 +1804,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1957,11 +1996,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3211,6 +3245,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -3238,6 +3277,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -4983,6 +5027,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -5017,6 +5066,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -6361,6 +6415,11 @@
     cls.add_method('SetParent', 
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'model')])
+    ## hierarchical-mobility-model.h (module 'mobility'): int64_t ns3::HierarchicalMobilityModel::DoAssignStreams(int64_t arg0) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'arg0')], 
+                   is_virtual=True, visibility='private')
     ## hierarchical-mobility-model.h (module 'mobility'): ns3::Vector ns3::HierarchicalMobilityModel::DoGetPosition() const [member function]
     cls.add_method('DoGetPosition', 
                    'ns3::Vector', 
@@ -6371,6 +6430,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
+    ## hierarchical-mobility-model.h (module 'mobility'): void ns3::HierarchicalMobilityModel::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     ## hierarchical-mobility-model.h (module 'mobility'): void ns3::HierarchicalMobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
     cls.add_method('DoSetPosition', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/bindings/modulegen__gcc_LP64.py ns-3.35/src/mobility/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/mobility/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -79,6 +79,8 @@
     module.add_class('GeographicPositions')
     ## geographic-positions.h (module 'mobility'): ns3::GeographicPositions::EarthSpheroidType [enumeration]
     module.add_enum('EarthSpheroidType', ['SPHERE', 'GRS80', 'WGS84'], outer_class=root_module['ns3::GeographicPositions'])
+    ## group-mobility-helper.h (module 'mobility'): ns3::GroupMobilityHelper [class]
+    module.add_class('GroupMobilityHelper')
     ## hash.h (module 'core'): ns3::Hasher [class]
     module.add_class('Hasher', import_from_module='ns.core')
     ## ipv4-address.h (module 'network'): ns3::Ipv4Address [class]
@@ -529,6 +531,7 @@
     register_Ns3DefaultDeleter__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
     register_Ns3EventId_methods(root_module, root_module['ns3::EventId'])
     register_Ns3GeographicPositions_methods(root_module, root_module['ns3::GeographicPositions'])
+    register_Ns3GroupMobilityHelper_methods(root_module, root_module['ns3::GroupMobilityHelper'])
     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'])
@@ -1433,6 +1436,57 @@
                    is_static=True)
     return
 
+def register_Ns3GroupMobilityHelper_methods(root_module, cls):
+    ## group-mobility-helper.h (module 'mobility'): ns3::GroupMobilityHelper::GroupMobilityHelper(ns3::GroupMobilityHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::GroupMobilityHelper const &', 'arg0')])
+    ## group-mobility-helper.h (module 'mobility'): ns3::GroupMobilityHelper::GroupMobilityHelper() [constructor]
+    cls.add_constructor([])
+    ## group-mobility-helper.h (module 'mobility'): int64_t ns3::GroupMobilityHelper::AssignStreams(ns3::NodeContainer c, int64_t stream) [member function]
+    cls.add_method('AssignStreams', 
+                   'int64_t', 
+                   [param('ns3::NodeContainer', 'c'), param('int64_t', 'stream')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::Install(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::Install(std::string nodeName) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('std::string', 'nodeName')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::Install(ns3::NodeContainer container) [member function]
+    cls.add_method('Install', 
+                   'void', 
+                   [param('ns3::NodeContainer', 'container')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetMemberMobilityModel(std::string type, 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()) [member function]
+    cls.add_method('SetMemberMobilityModel', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetMemberPositionAllocator(ns3::Ptr<ns3::PositionAllocator> allocator) [member function]
+    cls.add_method('SetMemberPositionAllocator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PositionAllocator >', 'allocator')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetMemberPositionAllocator(std::string type, 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()) [member function]
+    cls.add_method('SetMemberPositionAllocator', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferenceMobilityModel(ns3::Ptr<ns3::MobilityModel> mobility) [member function]
+    cls.add_method('SetReferenceMobilityModel', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::MobilityModel >', 'mobility')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferenceMobilityModel(std::string type, 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()) [member function]
+    cls.add_method('SetReferenceMobilityModel', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferencePositionAllocator(ns3::Ptr<ns3::PositionAllocator> allocator) [member function]
+    cls.add_method('SetReferencePositionAllocator', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::PositionAllocator >', 'allocator')])
+    ## group-mobility-helper.h (module 'mobility'): void ns3::GroupMobilityHelper::SetReferencePositionAllocator(std::string type, 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()) [member function]
+    cls.add_method('SetReferencePositionAllocator', 
+                   'void', 
+                   [param('std::string', 'type'), 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()')])
+    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')])
@@ -1530,11 +1584,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1639,11 +1688,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1760,11 +1804,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1957,11 +1996,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3211,6 +3245,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -3238,6 +3277,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -4983,6 +5027,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -5017,6 +5066,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -6361,6 +6415,11 @@
     cls.add_method('SetParent', 
                    'void', 
                    [param('ns3::Ptr< ns3::MobilityModel >', 'model')])
+    ## hierarchical-mobility-model.h (module 'mobility'): int64_t ns3::HierarchicalMobilityModel::DoAssignStreams(int64_t arg0) [member function]
+    cls.add_method('DoAssignStreams', 
+                   'int64_t', 
+                   [param('int64_t', 'arg0')], 
+                   is_virtual=True, visibility='private')
     ## hierarchical-mobility-model.h (module 'mobility'): ns3::Vector ns3::HierarchicalMobilityModel::DoGetPosition() const [member function]
     cls.add_method('DoGetPosition', 
                    'ns3::Vector', 
@@ -6371,6 +6430,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_virtual=True, visibility='private')
+    ## hierarchical-mobility-model.h (module 'mobility'): void ns3::HierarchicalMobilityModel::DoInitialize() [member function]
+    cls.add_method('DoInitialize', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='private')
     ## hierarchical-mobility-model.h (module 'mobility'): void ns3::HierarchicalMobilityModel::DoSetPosition(ns3::Vector const & position) [member function]
     cls.add_method('DoSetPosition', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/doc/mobility.rst ns-3.35/src/mobility/doc/mobility.rst
--- ns-3.34/src/mobility/doc/mobility.rst	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/doc/mobility.rst	2021-10-01 13:26:47.000000000 -0700
@@ -28,7 +28,7 @@
 The design includes mobility models, position allocators, and helper
 functions.  
 
-In |ns3|, special ``MobilityModel`` objects track the evolution of position
+In |ns3|, `MobilityModel`` objects track the evolution of position
 with respect to a (cartesian) coordinate system.  The mobility model
 is typically aggregated to an ``ns3::Node`` object and queried using
 ``GetObject<MobilityModel> ()``. The base class ``ns3::MobilityModel``
@@ -42,8 +42,8 @@
 
 Most users interact with the mobility system using mobility helper
 classes.  The MobilityHelper combines a mobility model and position
-allocator, and can be used with a node container to install mobility
-capability on a set of nodes.
+allocator, and can be used with a node container to install a similar
+mobility capability on a set of nodes.
 
 We first describe the coordinate system and issues 
 surrounding multiple coordinate systems.
@@ -58,7 +58,7 @@
 Cartesian coordinates) with different coordinate systems.  This is possible
 if the user performs conversion between the |ns3| Cartesian and the
 other coordinate system.  One possible library to assist is
-the proj4 http://trac.osgeo.org/proj/ library for projections and reverse 
+the `proj4 <https://proj.org>`_ library for projections and reverse 
 projections.
 
 If we support converting between coordinate systems, we must adopt a
@@ -136,13 +136,23 @@
 a MobilityModel factory object and a PositionAllocator used for
 initial node layout.  
 
+Group mobility is also configurable via a GroupMobilityHelper object.
+Group mobility reuses the HierarchicalMobilityModel allowing one to
+define a reference (parent) mobility model and child (member) mobility
+models, with the position being the vector sum of the two mobility
+model positions (i.e., the child position is defined as an offset to
+the parent position).  In the GroupMobilityHelper, the parent mobility
+model is not associated with any node, and is used as the parent mobility
+model for all (distinct) child mobility models.  The reference point group
+mobility model [Camp2002]_ is the basis for this |ns3| model.
+
 ns-2 MobilityHelper
 ###################
 
 The |ns2| mobility format is a widely used mobility trace format.  The
 documentation is available at: http://www.isi.edu/nsnam/ns/doc/node172.html
 
-Valid trace files use the following ns2 statements:
+Valid trace files use the following |ns2| statements:
 
 .. sourcecode:: bash
 
@@ -172,10 +182,10 @@
 
 - `BonnMotion <http://net.cs.uni-bonn.de/wg/cs/applications/bonnmotion/>`_
 
-  - `Installation instructions <http://www.nsnam.org/wiki/HOWTO_use_ns-3_with_BonnMotion_mobility_generator_and_analysis_tool>`_ and
-  - `Documentation <http://www.ida.liu.se/~rikno/files/mobility_generation.pdf>`_ for using BonnMotion with |ns3|
+  - `Installation instructions <https://www.nsnam.org/wiki/HOWTO_use_ns-3_with_BonnMotion_mobility_generator_and_analysis_tool>`_ and
+  - `Documentation <https://sys.cs.uos.de/bonnmotion/doc/README.pdf>`_ for using BonnMotion with |ns3|
 
-- `SUMO <http://sourceforge.net/apps/mediawiki/sumo/index.php?title=Main_Page>`_
+- `SUMO <https://sourceforge.net/apps/mediawiki/sumo/index.php?title=Main_Page>`_
 - `TraNS <http://trans.epfl.ch/>`_
 - |ns2| `setdest <http://www.winlab.rutgers.edu/~zhibinwu/html/ns2_wireless_scene.htm>`_ utility
 
@@ -193,7 +203,8 @@
 References
 ==========
 
-TBD
+.. [Camp2002] T. Camp, J. Boleng, V. Davies.  "A survey of mobility models for ad hoc network research",
+   in Wireless Communications and Mobile Computing, 2002: vol. 2, pp. 2483-2502.
 
 Usage
 *****
@@ -430,6 +441,27 @@
 - ns2-mobility-trace.cc
 - ns2-bonnmotion.cc
 
+reference-point-group-mobility-example.cc
+#########################################
+
+The reference point group mobility model ([Camp2002]_) is demonstrated
+in the example program `reference-point-group-mobility-example.cc`.
+This example runs a short simulation that illustrates a parent
+WaypointMobilityModel traversing a rectangular course within a bounding
+box, and three member nodes independently execute a two-dimensional
+random walk around the parent position, within a small bounding box.
+The example illustrates configuration using the GroupMobilityHelper
+and manual configuration without a helper; the configuration option
+is selectable by command-line argument.
+
+The example outputs two mobility trace files, a course change trace and
+a time-series trace of node position.  The latter trace file can be
+parsed by a Bash script (`reference-point-group-mobility-animate.sh`)
+to create PNG images at one-second intervals, which can then be combined
+using an image processing program such as ImageMagick to form a
+basic animated gif of the mobility.  The example and animation program
+files have further instructions on how to run them.
+
 Validation
 **********
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/examples/reference-point-group-mobility-animate.sh ns-3.35/src/mobility/examples/reference-point-group-mobility-animate.sh
--- ns-3.34/src/mobility/examples/reference-point-group-mobility-animate.sh	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/mobility/examples/reference-point-group-mobility-animate.sh	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,89 @@
+#!/bin/bash
+
+# Copyright (c) 2019, University of Padova, Dep. of Information Engineering, SIGNET lab
+# Copyright (c) 2021, University of Washington: animation extensions
+#
+# 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: Michele Polese <michele.polese@gmail.com>
+#          Tom Henderson <tomhend@uw.edu>
+
+#
+#  Plot the trace generated by reference-point-group-mobility-example.cc
+#  in a manner that enables animation
+#
+
+# This Bash script is a variant of outdoor-random-walk-example.sh that
+# generates a large number of PNG image files, one for each node position
+# traced in the mobility trace file 'reference-point-time-series.mob'.
+#
+# This script relies on gnuplot (version 5.0 or greater).
+#
+# The PNGs are named in increasing numerical order from '0000.png' to
+# '0799.png'.  The images can be assembled into an animated gif file
+# using a tool such as ImageMagick's convert utility, such as:
+#
+# $ convert -delay 10 -loop 0 *.png rpgm-animation.gif
+#
+# and the output file 'rpgm-animation.gif' can be viewed by an image viewer. 
+#
+# Because this file generates many PNG files, it is recommended to move
+# this script and the generated time-series mobility file 
+# named 'reference-point-time-series.mob' to a subdirectory, and then
+# run:
+# $ ./reference-point-group-mobility-animation.sh
+# $ convert -delay 10 -loop 0 *.png rpgm-animation.gif
+#  
+
+# The script first checks and enforces that only three nodes are present
+num_nodes=`cat reference-point-time-series.mob | awk '{ print $2 }' | sort -n | uniq | wc -l`
+if [ "$num_nodes" -ne "3" ]; then
+    echo "Exiting: this tracing program designed only for 3 nodes"
+    exit 1
+fi
+# Next, reduce the trace
+cat reference-point-time-series.mob | awk -F " " '{ print $3 }' | awk -F ":" '{ print $1" "$2 }' > rpgm-time-series.tmp
+# read three lines at a time from the reduced trace, convert to
+# a plottable temporary file, and invoke gnuplot.  Loop until done.
+n=0
+while read p1 && read p2 && read p3; do
+    basename=$(printf "%04d" "$n")
+    cat >plotcmds <<EOL
+# If you do not have pngcairo installed, you can 'set terminal png' below,
+# but it will render the dashed bounding box as a solid line
+set terminal pngcairo dashed
+set output '$basename.png'
+set view map
+set xlabel 'X [m]'
+set ylabel 'Y [m]'
+set xrange [-10:110]
+set yrange [-10:60]
+set style fill transparent solid 0.5
+unset key
+set style fill  transparent solid 0.35 noborder
+set style circle radius 0.5
+# Define dashed lines to mark the outer bounding box
+set arrow from 0,0 to 100,0 nohead dt "-" lc rgb "light-grey"
+set arrow from 100,0 to 100,50 nohead dt "-" lc rgb "light-grey"
+set arrow from 0,50 to 100,50 nohead dt "-" lc rgb "light-grey"
+set arrow from 0,0 to 0,50 nohead dt "-" lc rgb "light-grey"
+plot "<echo '$p1'" with circles lc rgb "red",\
+     "<echo '$p2'" with circles lc rgb "blue",\
+     "<echo '$p3'" with circles lc rgb "black"
+EOL
+    gnuplot plotcmds
+    rm plotcmds
+    (( n++ ))
+done < rpgm-time-series.tmp
+rm rpgm-time-series.tmp
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/examples/reference-point-group-mobility-example.cc ns-3.35/src/mobility/examples/reference-point-group-mobility-example.cc
--- ns-3.34/src/mobility/examples/reference-point-group-mobility-example.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/mobility/examples/reference-point-group-mobility-example.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,231 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2020 Institute for the Wireless Internet of Things, Northeastern University, Boston, MA
+ * Copyright (c) 2021 University of Washington: for HierarchicalMobilityModel
+ *
+ * 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: Michele Polese <michele.polese@gmail.com>
+ * Heavily edited by Tom Henderson (to reuse HierachicalMobilityModel)
+ */
+
+/**
+ * This example shows how to use the ns3::HierarchicalMobilityModel
+ * to construct a Reference Point Group Mobility model (RPGM) model
+ * as described in "A survey of mobility models for ad hoc network
+ * research" by Tracy Camp, Jeff Boleng, and Vanessa Davies, Wireless
+ * Communications and Mobile Computing, 2002: vol. 2, pp. 2483-502.
+ *
+ * The HierarchicalMobilityModel is composed of two mobility models;
+ * a parent and a child.  The position of the child is expressed
+ * in reference to the position of the parent.  For group mobility,
+ * each node in the group installs the same parent mobility model
+ * and different child mobility models.
+ *
+ * There is no node associated with the parent (reference) model.
+ * Instead, all nodes are associated with a hiearchical mobility model
+ * containing both the parent and child models, and the position of
+ * the node is the vector sum of these parent and child positions.
+ *
+ * Standard ns-3 mobility model course change output is traced in
+ * 'reference-point-course-change.mob' file.  This file only traces
+ * position when there is a course change.  A second trace is produced
+ * by this example: a time-series of node positions sampled every second.
+ * This file is 'reference-point-time-series.mob' and can be plotted
+ * with the 'reference-point-group-mobility-animation.sh' program.
+ *
+ * There is a bit of randomness in the child mobility models (random
+ * walk within a 10m x 10m box surrounding the parent mobility position);
+ * slightly different output can be rendered by changing the ns-3 'RunNumber'
+ * value (see the documentation on ns-3 random variables).
+ *
+ * There is one program option:  'useHelper'.  This is simply for code
+ * demonstration purposes; it selects the branch of code that is used
+ * to either configure the mobility using a helper object, or
+ * to directly configure using CreateObject<> () and handling of pointers.
+ * The traces generated should be the same.
+ */
+
+#include <iostream>
+#include "ns3/core-module.h"
+#include <ns3/mobility-module.h>
+#include "ns3/network-module.h"
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("ReferencePointGroupMobilityExample");
+
+std::ofstream g_timeSeries;
+
+void
+PrintPosition (Ptr<Node> node)
+{
+  if (node == nullptr) return;
+  Ptr<MobilityModel> model = node->GetObject<MobilityModel> ();
+  if (model == nullptr) return;
+  NS_LOG_LOGIC ("Node: " << node->GetId () << " Position: " << model->GetPosition ());
+  g_timeSeries << Simulator::Now ().GetSeconds () << " " << node->GetId () << " " << model->GetPosition () << std::endl;
+  
+}
+
+int
+main (int argc, char *argv[])
+{
+  Time simTime = Seconds (800);
+  uint32_t numPrints = 800;
+  bool useHelper = false;
+
+  CommandLine cmd (__FILE__);
+  cmd.AddValue ("useHelper", "Whether to use helper code", useHelper);
+  cmd.Parse (argc, argv);
+
+  g_timeSeries.open ("reference-point-time-series.mob");
+  
+  NodeContainer n;
+  n.Create (3);
+
+  // The primary mobility model is the WaypointMobilityModel defined within
+  // this bounding box:
+  //
+  // (0,50)                   (100,50)
+  //   +-------------------------+
+  //   |  .(10,40)    (90,40).   |
+  //   |                         |
+  //   |                         |
+  //   |  .(10,10)    (90,10).   |
+  //   |                         |
+  //   +-------------------------+
+  // (0,0)                     (100,0)
+  //
+
+  // The reference (parent) mobility model starts at coordinate (10,10
+  // and walks clockwise to each waypoint, making two laps.  The time
+  // to travel between each waypoint is 100s, so the velocity alternates
+  // between two values due to the rectangular path. 
+  // No actual node is represented by the position of this mobility
+  // model; it forms the reference point from which the node's child
+  // mobility model position is offset.
+  //
+  Ptr<WaypointMobilityModel> waypointMm = CreateObject<WaypointMobilityModel> ();
+  waypointMm->AddWaypoint (Waypoint (Seconds (0), Vector (10, 10, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (100), Vector (10, 40, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (200), Vector (90, 40, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (300), Vector (90, 10, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (400), Vector (10, 10, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (500), Vector (10, 40, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (600), Vector (90, 40, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (700), Vector (90, 10, 0)));
+  waypointMm->AddWaypoint (Waypoint (Seconds (800), Vector (10, 10, 0)));
+
+  // Each HierachicalMobilityModel contains the above model as the Parent,
+  // and a user defined model as the Child.  Two MobilityModel objects are
+  // instantiated per node (one hierarchical, and one child model), and
+  // a single parent model is reused across all nodes.
+
+  // The program now branches into two:  one using the low-level API, and
+  // one using the GroupMobilityHelper.  Both branches result in equivalent
+  // configuration.
+
+  int64_t streamIndex = 1;
+  if (useHelper == false)
+    {
+      // Assign random variable stream numbers on the parent and each child
+      streamIndex += waypointMm->AssignStreams (streamIndex);
+
+      // Mobility model for the first node (node 0)
+      Ptr<HierarchicalMobilityModel> hierarchical0 = CreateObject<HierarchicalMobilityModel> ();
+      hierarchical0->SetParent (waypointMm);
+    
+      // Child Mobility model for the first node (node 0).  This can be any
+      // other mobility model type; for this example, we reuse the random walk
+      // but with a small 10m x 10m bounding box.
+      Ptr<RandomWalk2dMobilityModel> childRandomWalk0 = CreateObject<RandomWalk2dMobilityModel> ();
+      // Position in reference to the original random walk
+      childRandomWalk0->SetAttribute ("Bounds", RectangleValue (Rectangle (-5, 5, -5, 5)));
+      childRandomWalk0->SetAttribute ("Speed", StringValue ("ns3::ConstantRandomVariable[Constant=0.1]"));
+      streamIndex += childRandomWalk0->AssignStreams (streamIndex);
+      hierarchical0->SetChild (childRandomWalk0);
+      n.Get (0)->AggregateObject (hierarchical0);
+      // Repeat for other two nodes
+      Ptr<HierarchicalMobilityModel> hierarchical1 = CreateObject<HierarchicalMobilityModel> ();
+      hierarchical1->SetParent (waypointMm); // Same parent as before
+      Ptr<RandomWalk2dMobilityModel> childRandomWalk1 = CreateObject<RandomWalk2dMobilityModel> ();
+      childRandomWalk1->SetAttribute ("Bounds", RectangleValue (Rectangle (-5, 5, -5, 5)));
+      childRandomWalk1->SetAttribute ("Speed", StringValue ("ns3::ConstantRandomVariable[Constant=0.1]"));
+      streamIndex += childRandomWalk1->AssignStreams (streamIndex);
+      hierarchical1->SetChild (childRandomWalk1);
+      n.Get (1)->AggregateObject (hierarchical1);
+      Ptr<HierarchicalMobilityModel> hierarchical2 = CreateObject<HierarchicalMobilityModel> ();
+      hierarchical2->SetParent (waypointMm); // Same parent as before
+      Ptr<RandomWalk2dMobilityModel> childRandomWalk2 = CreateObject<RandomWalk2dMobilityModel> ();
+      childRandomWalk2->SetAttribute ("Bounds", RectangleValue (Rectangle (-5, 5, -5, 5)));
+      childRandomWalk2->SetAttribute ("Speed", StringValue ("ns3::ConstantRandomVariable[Constant=0.1]"));
+      streamIndex += childRandomWalk2->AssignStreams (streamIndex);
+      hierarchical2->SetChild (childRandomWalk2);
+      n.Get (2)->AggregateObject (hierarchical2);
+    }
+  else
+    {
+      // This branch demonstrates an equivalent set of commands but using
+      // the GroupMobilityHelper
+      GroupMobilityHelper group;
+
+      // The helper provides a method to set the reference mobility model
+      // for construction by an object factory, but in this case, since we
+      // are using the WaypointMobilityModel, which requires us to add
+      // waypoints directly on the object, we will just pass in the pointer.
+      group.SetReferenceMobilityModel (waypointMm);
+
+      // The WaypointMobilityModel does not need a position allocator
+      // (it can use its first waypoint as such), but in general, the
+      // GroupMobilityHelper can be configured to accept configuration for
+      // a PositionAllocator for the reference model.  We skip that here.
+  
+      // Next, configure the member mobility model
+      group.SetMemberMobilityModel ("ns3::RandomWalk2dMobilityModel",
+        "Bounds", RectangleValue (Rectangle (-5, 5, -5, 5)),
+        "Speed", StringValue ("ns3::ConstantRandomVariable[Constant=0.1]"));
+
+      // Again, we could call 'SetMemberPositionAllocator' and provide a
+      // position allocator here for the member nodes, but none is provided
+      // in this example, so they will start at time zero with the same
+      // position as the reference node.
+
+      // Install to all three nodes
+      group.Install (n);
+
+      // After installation, use the helper to make the equivalent
+      // stream assignments as above 
+      group.AssignStreams (n, streamIndex);
+    }
+
+  // Note:  The tracing methods are static methods declared on the
+  // MobilityHelper class, not on the GroupMobilityHelper class
+  AsciiTraceHelper ascii;
+  MobilityHelper::EnableAsciiAll (ascii.CreateFileStream ("reference-point-course-change.mob"));
+
+  // Use a logging PrintPosition() to record time-series position
+  for (unsigned int i = 0; i < numPrints; i++)
+    {
+      for (auto nodeIt = n.Begin (); nodeIt != n.End (); ++nodeIt)
+        {
+          Simulator::Schedule (NanoSeconds (i * simTime.GetNanoSeconds () / numPrints), &PrintPosition, (*nodeIt));
+        }
+    }
+
+  Simulator::Stop (simTime);
+  Simulator::Run ();
+  g_timeSeries.close ();
+  Simulator::Destroy ();
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/examples/wscript ns-3.35/src/mobility/examples/wscript
--- ns-3.34/src/mobility/examples/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/examples/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -27,3 +27,7 @@
     obj = bld.create_ns3_program('bonnmotion-ns2-example', 
                                  ['core', 'mobility'])
     obj.source = 'bonnmotion-ns2-example.cc'
+
+    obj = bld.create_ns3_program('reference-point-group-mobility-example',
+                                 ['core', 'network', 'mobility'])
+    obj.source = 'reference-point-group-mobility-example.cc'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/helper/group-mobility-helper.cc ns-3.35/src/mobility/helper/group-mobility-helper.cc
--- ns-3.34/src/mobility/helper/group-mobility-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/mobility/helper/group-mobility-helper.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,239 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2021 University of Washington: Group mobility changes
+ *
+ * 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>
+ * Adapted from 'mobility-helper.cc' for group mobility by Tom Henderson
+ */
+
+#include "ns3/group-mobility-helper.h"
+#include "ns3/mobility-model.h"
+#include "ns3/position-allocator.h"
+#include "ns3/hierarchical-mobility-model.h"
+#include "ns3/log.h"
+#include "ns3/pointer.h"
+#include "ns3/config.h"
+#include "ns3/simulator.h"
+#include "ns3/names.h"
+#include "ns3/string.h"
+#include <iostream>
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("GroupMobilityHelper");
+
+GroupMobilityHelper::GroupMobilityHelper ()
+{
+}
+
+GroupMobilityHelper::~GroupMobilityHelper ()
+{
+}
+
+void
+GroupMobilityHelper::SetReferencePositionAllocator (Ptr<PositionAllocator> allocator)
+{
+  m_referencePosition = allocator;
+}
+
+void
+GroupMobilityHelper::SetReferencePositionAllocator (std::string type,
+                                      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)
+{
+  ObjectFactory pos;
+  pos.SetTypeId (type);
+  pos.Set (n1, v1);
+  pos.Set (n2, v2);
+  pos.Set (n3, v3);
+  pos.Set (n4, v4);
+  pos.Set (n5, v5);
+  pos.Set (n6, v6);
+  pos.Set (n7, v7);
+  pos.Set (n8, v8);
+  pos.Set (n9, v9);
+  m_referencePosition = pos.Create ()->GetObject<PositionAllocator> ();
+  NS_ABORT_MSG_IF (m_referencePosition == nullptr, "Unable to create allocator from TypeId " << type);
+}
+
+void
+GroupMobilityHelper::SetMemberPositionAllocator (Ptr<PositionAllocator> allocator)
+{
+  m_memberPosition = allocator;
+}
+
+void
+GroupMobilityHelper::SetMemberPositionAllocator (std::string type,
+                                      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)
+{
+  ObjectFactory pos;
+  pos.SetTypeId (type);
+  pos.Set (n1, v1);
+  pos.Set (n2, v2);
+  pos.Set (n3, v3);
+  pos.Set (n4, v4);
+  pos.Set (n5, v5);
+  pos.Set (n6, v6);
+  pos.Set (n7, v7);
+  pos.Set (n8, v8);
+  pos.Set (n9, v9);
+  m_memberPosition = pos.Create ()->GetObject<PositionAllocator> ();
+  NS_ABORT_MSG_IF (m_memberPosition == nullptr, "Unable to create allocator from TypeId " << type);
+}
+
+void
+GroupMobilityHelper::SetReferenceMobilityModel (Ptr<MobilityModel> mobility)
+{
+  m_referenceMobility = mobility;
+}
+
+void 
+GroupMobilityHelper::SetReferenceMobilityModel (std::string type,
+                                  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)
+{
+  NS_LOG_FUNCTION (this << type);
+  ObjectFactory mob;
+  mob.SetTypeId (type);
+  mob.Set (n1, v1);
+  mob.Set (n2, v2);
+  mob.Set (n3, v3);
+  mob.Set (n4, v4);
+  mob.Set (n5, v5);
+  mob.Set (n6, v6);
+  mob.Set (n7, v7);
+  mob.Set (n8, v8);
+  mob.Set (n9, v9);
+  m_referenceMobility = mob.Create ()->GetObject<MobilityModel> ();
+  NS_ABORT_MSG_IF (m_referenceMobility == nullptr, "Unable to create mobility from TypeId " << type);
+}
+
+void 
+GroupMobilityHelper::SetMemberMobilityModel (std::string type,
+                                  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)
+{
+  NS_LOG_FUNCTION (this << type);
+  m_memberMobilityFactory.SetTypeId (type);
+  m_memberMobilityFactory.Set (n1, v1);
+  m_memberMobilityFactory.Set (n2, v2);
+  m_memberMobilityFactory.Set (n3, v3);
+  m_memberMobilityFactory.Set (n4, v4);
+  m_memberMobilityFactory.Set (n5, v5);
+  m_memberMobilityFactory.Set (n6, v6);
+  m_memberMobilityFactory.Set (n7, v7);
+  m_memberMobilityFactory.Set (n8, v8);
+  m_memberMobilityFactory.Set (n9, v9);
+}
+
+void
+GroupMobilityHelper::Install (Ptr<Node> node)
+{
+  NS_ABORT_MSG_IF (node->GetObject<MobilityModel> () != nullptr, "Mobility model already installed");
+  NS_ABORT_MSG_IF (m_referenceMobility == nullptr, "Reference mobility model is empty");
+  NS_ABORT_MSG_UNLESS (m_memberMobilityFactory.IsTypeIdSet (), "Member mobility factory is unset");
+  if (m_referencePosition && !m_referencePositionSet)
+    {
+      Vector referencePosition = m_referencePosition->GetNext ();
+      m_referenceMobility->SetPosition (referencePosition);
+      m_referencePositionSet = true;
+    }
+  Ptr<HierarchicalMobilityModel> hierarchical = CreateObject<HierarchicalMobilityModel> ();
+  hierarchical->SetParent (m_referenceMobility);
+  Ptr<MobilityModel> child = m_memberMobilityFactory.Create ()->GetObject<MobilityModel> ();
+  NS_ABORT_MSG_IF (child == nullptr, "Member mobility factory did not produce a MobilityModel");
+  if (m_memberPosition)
+    {
+      Vector position = m_memberPosition->GetNext ();
+      child->SetPosition (position);
+    }
+  hierarchical->SetChild (child);
+  NS_LOG_DEBUG ("node="<<node<<", mob="<<hierarchical);
+  node->AggregateObject (hierarchical);
+}
+
+void
+GroupMobilityHelper::Install (std::string nodeName)
+{
+  Ptr<Node> node = Names::Find<Node> (nodeName);
+  Install (node);
+}
+
+void 
+GroupMobilityHelper::Install (NodeContainer c)
+{
+  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+      Install (*i);
+    }
+}
+int64_t
+GroupMobilityHelper::AssignStreams (NodeContainer c, int64_t stream)
+{
+  int64_t currentStream = stream;
+  Ptr<Node> node;
+  bool firstNode = true;
+  Ptr<HierarchicalMobilityModel> mobility;
+  for (NodeContainer::Iterator i = c.Begin (); i != c.End (); ++i)
+    {
+      node = (*i);
+      mobility = node->GetObject<HierarchicalMobilityModel> ();
+      if (!mobility)
+        {
+          NS_FATAL_ERROR ("Did not find a HierarchicalMobilityModel");
+        }
+      if (firstNode)
+        {
+          // Assign streams only once for the reference node
+          currentStream += mobility->GetParent ()->AssignStreams (currentStream);
+          firstNode = false;
+        }
+      currentStream += mobility->GetChild ()->AssignStreams (currentStream);
+    }
+  return (currentStream - stream);
+}
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/helper/group-mobility-helper.h ns-3.35/src/mobility/helper/group-mobility-helper.h
--- ns-3.34/src/mobility/helper/group-mobility-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/mobility/helper/group-mobility-helper.h	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,289 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2008 INRIA
+ * Copyright (c) 2021 University of Washington: Group mobility changes
+ *
+ * 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>
+ * Adapted from 'mobility-helper.h' for group mobility by Tom Henderson
+ */
+
+#ifndef GROUP_MOBILITY_HELPER_H
+#define GROUP_MOBILITY_HELPER_H
+
+#include <vector>
+#include "ns3/object-factory.h"
+#include "ns3/attribute.h"
+#include "ns3/node-container.h"
+
+namespace ns3 {
+
+class PositionAllocator;
+class MobilityModel;
+
+/**
+ * \ingroup mobility
+ * \brief Helper class used to assign positions and mobility models to nodes
+ * for a group mobility configuration.
+ *
+ * This helper can be used for group mobility configuration and installation
+ * onto a group of nodes, in which there is a reference (parent) mobility
+ * model that is the same for all nodes, and similarly configured (but
+ * distinct) child mobility models.
+ */
+class GroupMobilityHelper
+{
+public:
+  /**
+   * Construct a group mobility helper 
+   */
+  GroupMobilityHelper ();
+
+  /**
+   * Destroy a group mobility helper
+   */
+  ~GroupMobilityHelper ();
+
+  /**
+   * Set the position allocator which will be used to allocate the initial 
+   * position of the reference mobility model.
+   *
+   * \param allocator allocate initial reference mobility model position
+   */
+  void SetReferencePositionAllocator (Ptr<PositionAllocator> allocator);
+
+  /**
+   * Configure the position allocator which will be used to allocate
+   * the initial position of the reference mobility model.
+   *
+   * \param type the type of mobility model to use.
+   * \param n1 the name of the attribute to set in the mobility model.
+   * \param v1 the value of the attribute to set in the mobility model.
+   * \param n2 the name of the attribute to set in the mobility model.
+   * \param v2 the value of the attribute to set in the mobility model.
+   * \param n3 the name of the attribute to set in the mobility model.
+   * \param v3 the value of the attribute to set in the mobility model.
+   * \param n4 the name of the attribute to set in the mobility model.
+   * \param v4 the value of the attribute to set in the mobility model.
+   * \param n5 the name of the attribute to set in the mobility model.
+   * \param v5 the value of the attribute to set in the mobility model.
+   * \param n6 the name of the attribute to set in the mobility model.
+   * \param v6 the value of the attribute to set in the mobility model.
+   * \param n7 the name of the attribute to set in the mobility model.
+   * \param v7 the value of the attribute to set in the mobility model.
+   * \param n8 the name of the attribute to set in the mobility model.
+   * \param v8 the value of the attribute to set in the mobility model.
+   * \param n9 the name of the attribute to set in the mobility model.
+   * \param v9 the value of the attribute to set in the mobility model.
+   */
+  void SetReferencePositionAllocator (std::string type,
+                             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 ());
+
+  /**
+   * Set the position allocator which will be used to allocate the initial 
+   * position of the member mobility models.
+   *
+   * \param allocator allocate initial member mobility model positions
+   */
+  void SetMemberPositionAllocator (Ptr<PositionAllocator> allocator);
+
+  /**
+   * Configure the position allocator which will be used to allocate the
+   * initial position of the member mobility models.
+   *
+   * \param type the type of mobility model to use.
+   * \param n1 the name of the attribute to set in the mobility model.
+   * \param v1 the value of the attribute to set in the mobility model.
+   * \param n2 the name of the attribute to set in the mobility model.
+   * \param v2 the value of the attribute to set in the mobility model.
+   * \param n3 the name of the attribute to set in the mobility model.
+   * \param v3 the value of the attribute to set in the mobility model.
+   * \param n4 the name of the attribute to set in the mobility model.
+   * \param v4 the value of the attribute to set in the mobility model.
+   * \param n5 the name of the attribute to set in the mobility model.
+   * \param v5 the value of the attribute to set in the mobility model.
+   * \param n6 the name of the attribute to set in the mobility model.
+   * \param v6 the value of the attribute to set in the mobility model.
+   * \param n7 the name of the attribute to set in the mobility model.
+   * \param v7 the value of the attribute to set in the mobility model.
+   * \param n8 the name of the attribute to set in the mobility model.
+   * \param v8 the value of the attribute to set in the mobility model.
+   * \param n9 the name of the attribute to set in the mobility model.
+   * \param v9 the value of the attribute to set in the mobility model.
+   */
+  void SetMemberPositionAllocator (std::string type,
+                             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 ());
+
+  /**
+   * Set the reference mobility model which will be installed as the parent
+   * mobility model during GroupMobilityModel::Install.
+   *
+   * \param mobility reference mobility model
+   */
+  void SetReferenceMobilityModel (Ptr<MobilityModel> mobility);
+
+  /**
+   * Configure the reference mobility model which will be installed as the
+   * parent mobility model during GroupMobilityModel::Install.
+   *
+   * \param type the type of mobility model to use.
+   * \param n1 the name of the attribute to set in the mobility model.
+   * \param v1 the value of the attribute to set in the mobility model.
+   * \param n2 the name of the attribute to set in the mobility model.
+   * \param v2 the value of the attribute to set in the mobility model.
+   * \param n3 the name of the attribute to set in the mobility model.
+   * \param v3 the value of the attribute to set in the mobility model.
+   * \param n4 the name of the attribute to set in the mobility model.
+   * \param v4 the value of the attribute to set in the mobility model.
+   * \param n5 the name of the attribute to set in the mobility model.
+   * \param v5 the value of the attribute to set in the mobility model.
+   * \param n6 the name of the attribute to set in the mobility model.
+   * \param v6 the value of the attribute to set in the mobility model.
+   * \param n7 the name of the attribute to set in the mobility model.
+   * \param v7 the value of the attribute to set in the mobility model.
+   * \param n8 the name of the attribute to set in the mobility model.
+   * \param v8 the value of the attribute to set in the mobility model.
+   * \param n9 the name of the attribute to set in the mobility model.
+   * \param v9 the value of the attribute to set in the mobility model.
+   */
+  void SetReferenceMobilityModel (std::string type,
+                         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 ());
+
+  /**
+   * Configure the mobility model which will be installed as the
+   * member (child) mobility model during GroupMobilityModel::Install.
+   * 
+   * \param type the type of mobility model to use.
+   * \param n1 the name of the attribute to set in the mobility model.
+   * \param v1 the value of the attribute to set in the mobility model.
+   * \param n2 the name of the attribute to set in the mobility model.
+   * \param v2 the value of the attribute to set in the mobility model.
+   * \param n3 the name of the attribute to set in the mobility model.
+   * \param v3 the value of the attribute to set in the mobility model.
+   * \param n4 the name of the attribute to set in the mobility model.
+   * \param v4 the value of the attribute to set in the mobility model.
+   * \param n5 the name of the attribute to set in the mobility model.
+   * \param v5 the value of the attribute to set in the mobility model.
+   * \param n6 the name of the attribute to set in the mobility model.
+   * \param v6 the value of the attribute to set in the mobility model.
+   * \param n7 the name of the attribute to set in the mobility model.
+   * \param v7 the value of the attribute to set in the mobility model.
+   * \param n8 the name of the attribute to set in the mobility model.
+   * \param v8 the value of the attribute to set in the mobility model.
+   * \param n9 the name of the attribute to set in the mobility model.
+   * \param v9 the value of the attribute to set in the mobility model.
+   *
+   * Calls to MobilityHelper::Install will create an instance of a matching 
+   * mobility model for each node.
+   */
+  void SetMemberMobilityModel (std::string type,
+                         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 ());
+
+  /**
+   * \brief Install and configure a hierarchical mobility model to the
+   * given node, based on the configured reference and member models.
+   *
+   * If position allocators are configured, they will be invoked to
+   * set the initial position.
+   *
+   * \param node The node to configure
+   */
+  void Install (Ptr<Node> node);
+  /**
+   * \brief Install and configure a hierarchical mobility model to the
+   * given node, based on the configured reference and member models.
+   *
+   * If position allocators are configured, they will be invoked to
+   * set the initial position.
+   *
+   * \param nodeName The name of the node to configure
+   */
+  void Install (std::string nodeName);
+
+  /**
+   * \brief Install and configure a hierarchical mobility model to all nodes
+   * in the container, based on the configured reference and member models.
+   *
+   * If position allocators are configured, they will be invoked to
+   * set the initial positions.
+   *
+   * \param container The set of nodes to configure
+   */
+  void Install (NodeContainer container);
+
+  /**
+   * Assign a fixed random variable stream number to the random variables
+   * used by the mobility models on these nodes. Return the number of 
+   * streams (possibly zero) that have been assigned. The Install() 
+   * method should have previously been called by the user.
+   *
+   * \note If the PositionAllocator used contains random variables, they
+   * will not be affected by this call to AssignStreams because they are
+   * used earlier during Install() time.  If the user needs to assign a fixed
+   * stream number to a PositionAllocator used with this helper, the user
+   * should instantiate it outside of the helper, call AssignStreams() on
+   * it, and then pass the pointer of it to this helper.
+   *
+   * \param c NodeContainer of the set of nodes containing the MobilityModels
+   * that should be modified to use a fixed stream
+   * \param stream first stream index to use
+   * \return the number of stream indices assigned by this helper
+   */
+  int64_t AssignStreams (NodeContainer c, int64_t stream);
+
+private:
+
+  bool m_referencePositionSet {false}; //!< flag for avoiding multiple SetPosition calls on the reference model
+  Ptr<MobilityModel> m_referenceMobility; //!< Reference mobility model
+  Ptr<PositionAllocator> m_referencePosition; //!< Position allocator for use as reference position allocator
+  ObjectFactory  m_memberMobilityFactory; //!< Object factory to create member mobility models
+  Ptr<PositionAllocator> m_memberPosition; //!< Position allocator for use as member position allocator
+};
+
+} // namespace ns3
+
+#endif /* GROUP_MOBILITY_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/helper/mobility-helper.cc ns-3.35/src/mobility/helper/mobility-helper.cc
--- ns-3.34/src/mobility/helper/mobility-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/helper/mobility-helper.cc	2021-10-01 13:26:47.000000000 -0700
@@ -209,14 +209,13 @@
 MobilityHelper::CourseChanged (Ptr<OutputStreamWrapper> stream, Ptr<const MobilityModel> mobility)
 {
   std::ostream* os = stream->GetStream ();
-  Ptr<Node> node = mobility->GetObject<Node> ();
-  *os << "now=" << Simulator::Now ()
-      << " node=" << node->GetId ();
   Vector pos = mobility->GetPosition ();
+  Vector vel = mobility->GetVelocity ();
+  *os << "now=" << Simulator::Now ()
+      << " node=" << mobility->GetObject<Node> ()->GetId ();
   pos.x = DoRound (pos.x);
   pos.y = DoRound (pos.y);
   pos.z = DoRound (pos.z);
-  Vector vel = mobility->GetVelocity ();
   vel.x = DoRound (vel.x);
   vel.y = DoRound (vel.y);
   vel.z = DoRound (vel.z);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/helper/mobility-helper.h ns-3.35/src/mobility/helper/mobility-helper.h
--- ns-3.34/src/mobility/helper/mobility-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/helper/mobility-helper.h	2021-10-01 13:26:47.000000000 -0700
@@ -251,14 +251,20 @@
   static void EnableAsciiAll (Ptr<OutputStreamWrapper> stream);
   /**
    * Assign a fixed random variable stream number to the random variables
-   * used by the mobility models (including any position allocators assigned
-   * specifically to the model) on these nodes. Return the number of 
+   * used by the mobility models on these nodes. Return the number of 
    * streams (possibly zero) that have been assigned. The Install() 
    * method should have previously been called by the user.
    *
-   * \param stream first stream index to use
+   * \note If the PositionAllocator used contains random variables, they
+   * will not be affected by this call to AssignStreams because they are
+   * used earlier during Install() time.  If the user needs to assign a fixed
+   * stream number to a PositionAllocator used with this helper, the user
+   * should instantiate it outside of the helper, call AssignStreams() on
+   * it, and then pass the pointer of it to this helper.
+   *
    * \param c NodeContainer of the set of nodes for which the MobilityModels
    * should be modified to use a fixed stream
+   * \param stream first stream index to use
    * \return the number of stream indices assigned by this helper
    */
   int64_t AssignStreams (NodeContainer c, int64_t stream);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/model/hierarchical-mobility-model.cc ns-3.35/src/mobility/model/hierarchical-mobility-model.cc
--- ns-3.34/src/mobility/model/hierarchical-mobility-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/model/hierarchical-mobility-model.cc	2021-10-01 13:26:47.000000000 -0700
@@ -19,9 +19,13 @@
  */
 #include "hierarchical-mobility-model.h"
 #include "ns3/pointer.h"
+#include "ns3/log.h"
+#include "ns3/simulator.h"
 
 namespace ns3 {
 
+NS_LOG_COMPONENT_DEFINE ("HierarchicalMobilityModel");
+
 NS_OBJECT_ENSURE_REGISTERED (HierarchicalMobilityModel);
 
 TypeId 
@@ -49,15 +53,18 @@
   : m_child (0),
     m_parent (0)
 {
+  NS_LOG_FUNCTION (this);
 }
 
 void
 HierarchicalMobilityModel::SetChild (Ptr<MobilityModel> model)
 {
+  NS_LOG_FUNCTION (this << model);
   Ptr<MobilityModel> oldChild = m_child;
   Vector pos;
   if (m_child)
     {
+      NS_LOG_DEBUG ("Disconnecting previous child model " << m_child);
       pos = GetPosition ();
       m_child->TraceDisconnectWithoutContext ("CourseChange", MakeCallback (&HierarchicalMobilityModel::ChildChanged, this));
     }
@@ -68,6 +75,7 @@
   // try to preserve the old absolute position.
   if (oldChild)
     {
+      NS_LOG_DEBUG ("Restoring previous position " << pos);
       SetPosition (pos);
     }
 }
@@ -75,6 +83,7 @@
 void 
 HierarchicalMobilityModel::SetParent (Ptr<MobilityModel> model)
 {
+  NS_LOG_FUNCTION (this << model);
   Vector pos;
   if (m_child)
     {
@@ -82,6 +91,7 @@
     }
   if (m_parent)
     {
+      NS_LOG_DEBUG ("Disconnecting previous parent model " << m_child);
       m_parent->TraceDisconnectWithoutContext ("CourseChange", MakeCallback (&HierarchicalMobilityModel::ParentChanged, this));
     }
   m_parent = model;
@@ -92,6 +102,7 @@
   // try to preserve the old position across parent changes
   if (m_child)
     {
+      NS_LOG_DEBUG ("Restoring previous position " << pos);
       SetPosition (pos);
     }
 }
@@ -117,7 +128,7 @@
       return m_child->GetPosition ();
     }
   Vector parentPosition = m_parent->GetPosition ();
-  Vector childPosition = m_child->GetPosition ();
+  Vector childPosition = m_child->GetPositionWithReference (parentPosition);
   return Vector (parentPosition.x + childPosition.x,
                  parentPosition.y + childPosition.y,
                  parentPosition.z + childPosition.z);
@@ -125,6 +136,7 @@
 void 
 HierarchicalMobilityModel::DoSetPosition (const Vector &position)
 {
+  NS_LOG_FUNCTION (this << position);
   if (m_child == 0)
     {
       return;
@@ -174,6 +186,25 @@
   MobilityModel::NotifyCourseChange ();
 }
 
+void
+HierarchicalMobilityModel::DoInitialize (void)
+{
+  NS_LOG_FUNCTION (this);
+  if (m_parent && !m_parent->IsInitialized ())
+    {
+      m_parent->Initialize ();
+    }
+  m_child->Initialize ();
+}
 
+int64_t
+HierarchicalMobilityModel::DoAssignStreams (int64_t stream)
+{
+  NS_LOG_FUNCTION (this << stream);
+  int64_t streamsAllocated = 0;
+  streamsAllocated += m_parent->AssignStreams (stream);
+  streamsAllocated += m_child->AssignStreams (stream + streamsAllocated);
+  return streamsAllocated;
+}
 
 } // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/model/hierarchical-mobility-model.h ns-3.35/src/mobility/model/hierarchical-mobility-model.h
--- ns-3.34/src/mobility/model/hierarchical-mobility-model.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/model/hierarchical-mobility-model.h	2021-10-01 13:26:47.000000000 -0700
@@ -68,31 +68,33 @@
   /**
    * \return the child mobility model.
    *
-   * This allows you to get access to the position of the child
-   * relative to its parent.
+   * Calling GetPosition() on the model returned by this method allows
+   * one to access the position of the child relative to its parent.
    */
   Ptr<MobilityModel> GetChild (void) const;
   /**
    * \return the parent mobility model.
    *
-   * This allows you to get access to the position of the 
-   * parent mobility model which is used as the reference 
-   * position by the child mobility model.
+   * Calling GetPosition() on the model returned by this method allows
+   * one to access the position of the parent alone, which is used
+   * as the reference position to which the child position is added.
    */
   Ptr<MobilityModel> GetParent (void) const;
   /**
-   * Sets the child mobility model to a new one.  If before there
-   * already existed a child model, then the child mobility model
-   * current position is also modified to ensure that the composite
-   * position is preserved.
+   * Sets the child mobility model to a new one, possibly replacing
+   * an existing one.  If the child model is being replaced,
+   * then the new child mobility model's current position is also set to
+   * the previous position to ensure that the composite
+   * position is preserved by this operation.
    * \param model new mobility model child
    */
   void SetChild (Ptr<MobilityModel> model);
   /**
-   * Sets the parent mobility model to a new one.  If before there
-   * already existed a child model, then the child mobility model
-   * current position is also modified to ensure that the composite
-   * position is preserved.
+   * Sets the parent mobility model to a new one, possibly replacing
+   * an existing one.  If the parent model is being replaced,
+   * then the new position is set to the position that was set before
+   * replacement, to ensure that the composite position is preserved
+   * across changes to the parent model.
    * \param model new mobility model parent
    */
   void SetParent (Ptr<MobilityModel> model);
@@ -101,6 +103,8 @@
   virtual Vector DoGetPosition (void) const;
   virtual void DoSetPosition (const Vector &position);
   virtual Vector DoGetVelocity (void) const;
+  virtual void DoInitialize (void);
+  virtual int64_t DoAssignStreams (int64_t);
 
   /**
    * Callback for when parent mobility model course change occurs
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/model/mobility-model.cc ns-3.35/src/mobility/model/mobility-model.cc
--- ns-3.34/src/mobility/model/mobility-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/model/mobility-model.cc	2021-10-01 13:26:47.000000000 -0700
@@ -66,6 +66,19 @@
   return DoGetPosition ();
 }
 Vector
+MobilityModel::GetPositionWithReference (const Vector& referencePosition) const
+{
+  return DoGetPositionWithReference (referencePosition);
+}
+
+// Default implementation ignores referencePosition
+Vector
+MobilityModel::DoGetPositionWithReference (const Vector& referencePosition) const
+{
+  return DoGetPosition ();
+}
+
+Vector
 MobilityModel::GetVelocity (void) const
 {
   return DoGetVelocity ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/model/mobility-model.h ns-3.35/src/mobility/model/mobility-model.h
--- ns-3.34/src/mobility/model/mobility-model.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/model/mobility-model.h	2021-10-01 13:26:47.000000000 -0700
@@ -52,6 +52,18 @@
    */
   Vector GetPosition (void) const;
   /**
+   * This method may be used if the position returned may depend on some
+   * reference position provided.  For example, in a hierarchical mobility
+   * model that is buildings-aware, the child mobility model may not be able
+   * to determine if it is inside or outside of a building unless it knows
+   * the parent position.
+   *
+   * \param referencePosition reference position to consider
+   * \return the current position based on the provided referencePosition
+   * \sa ns3::MobilityModel::DoGetPositionWithReference
+   */
+  Vector GetPositionWithReference (const Vector &referencePosition) const;
+  /**
    * \param position the position to set.
    */
   void SetPosition (const Vector &position);
@@ -101,6 +113,14 @@
    */
   virtual Vector DoGetPosition (void) const = 0;
   /**
+   * \param referencePosition the reference position to consider
+   * \return the current position.
+   *
+   * Unless subclasses override, this method will disregard the reference
+   * position and return "DoGetPosition (void)".
+   */
+  virtual Vector DoGetPositionWithReference (const Vector& referencePosition) const;
+  /**
    * \param position the position to set.
    *
    * Concrete subclasses of this base class must 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mobility/test/examples-to-run.py ns-3.35/src/mobility/test/examples-to-run.py
--- ns-3.34/src/mobility/test/examples-to-run.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/test/examples-to-run.py	2021-10-01 13:26:47.000000000 -0700
@@ -11,6 +11,8 @@
     ("main-grid-topology", "True", "True"),
     ("main-random-topology", "True", "True"),
     ("main-random-walk", "True", "True"),
+    ("reference-point-group-mobility-example --useHelper=0", "True", "True"),
+    ("reference-point-group-mobility-example --useHelper=1", "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.34/src/mobility/wscript ns-3.35/src/mobility/wscript
--- ns-3.34/src/mobility/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mobility/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -22,6 +22,7 @@
         'model/waypoint-mobility-model.cc',
         'helper/mobility-helper.cc',
         'helper/ns2-mobility-helper.cc',
+        'helper/group-mobility-helper.cc',
         ]
 
     mobility_test = bld.create_ns3_module_test_library('mobility')
@@ -64,6 +65,7 @@
         'model/waypoint-mobility-model.h',
         'helper/mobility-helper.h',
         'helper/ns2-mobility-helper.h',
+        'helper/group-mobility-helper.h',
         ]
 
     if (bld.env['ENABLE_EXAMPLES']):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mpi/examples/nms-p2p-nix-distributed.cc ns-3.35/src/mpi/examples/nms-p2p-nix-distributed.cc
--- ns-3.34/src/mpi/examples/nms-p2p-nix-distributed.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mpi/examples/nms-p2p-nix-distributed.cc	2021-10-01 13:26:47.000000000 -0700
@@ -47,7 +47,7 @@
 #include "ns3/packet-sink-helper.h"
 #include "ns3/point-to-point-helper.h"
 #include "ns3/mpi-interface.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 
 #include <fstream>
 #include <vector>
@@ -283,7 +283,7 @@
         {
           oss.str ("");
           oss << 10 + z << ".5." << 10 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.255");
+          address.SetBase (oss.str ().c_str (), "255.255.255.0");
           for (uint32_t j = 0; j < nLANClients; ++j)
             {
               Ptr<Node> node = CreateObject<Node> (z % systemCount);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mpi/examples/simple-distributed.cc ns-3.35/src/mpi/examples/simple-distributed.cc
--- ns-3.34/src/mpi/examples/simple-distributed.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mpi/examples/simple-distributed.cc	2021-10-01 13:26:47.000000000 -0700
@@ -53,7 +53,7 @@
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/point-to-point-helper.h"
 #include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/on-off-helper.h"
 #include "ns3/packet-sink-helper.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mpi/examples/simple-distributed-empty-node.cc ns-3.35/src/mpi/examples/simple-distributed-empty-node.cc
--- ns-3.34/src/mpi/examples/simple-distributed-empty-node.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mpi/examples/simple-distributed-empty-node.cc	2021-10-01 13:26:47.000000000 -0700
@@ -72,7 +72,7 @@
 #include "ns3/ipv4-global-routing-helper.h"
 #include "ns3/point-to-point-helper.h"
 #include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/on-off-helper.h"
 #include "ns3/packet-sink-helper.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/mpi/examples/simple-distributed-mpi-comm.cc ns-3.35/src/mpi/examples/simple-distributed-mpi-comm.cc
--- ns-3.34/src/mpi/examples/simple-distributed-mpi-comm.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/mpi/examples/simple-distributed-mpi-comm.cc	2021-10-01 13:26:47.000000000 -0700
@@ -65,7 +65,7 @@
 #include "ns3/ipv4-list-routing-helper.h"
 #include "ns3/point-to-point-helper.h"
 #include "ns3/internet-stack-helper.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 #include "ns3/ipv4-address-helper.h"
 #include "ns3/on-off-helper.h"
 #include "ns3/packet-sink.h"
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/netanim/bindings/modulegen__gcc_ILP32.py ns-3.35/src/netanim/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/netanim/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/netanim/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -33,7 +33,7 @@
     ## 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_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_80211p', '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]
@@ -916,9 +916,15 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )', 'ns3::WifiPhy::MonitorSnifferTxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferTxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferTxCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::WifiPhy::PhyTxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::WifiPhy::PhyTxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::WifiPhy::PhyTxBeginTracedCallback&')
     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::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )', 'ns3::WifiPhy::PhyRxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )*', 'ns3::WifiPhy::PhyRxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )&', 'ns3::WifiPhy::PhyRxBeginTracedCallback&')
     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&')
@@ -1391,7 +1397,7 @@
     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::pair< unsigned int, unsigned int >, double >', ('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('std::list< ns3::LteRrcSap::SrbToAddMod >', 'ns3::LteRrcSap::SrbToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::DrbToAddMod >', 'ns3::LteRrcSap::DrbToAddMod', container_type='list')
@@ -1417,7 +1423,7 @@
     module.add_container('std::vector< int >', 'int', container_type='vector')
     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')
-    module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::vector< ns3::BandInfo >', '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')
@@ -1430,7 +1436,6 @@
     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')
@@ -3918,18 +3923,18 @@
     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 const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [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 const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
                    [param('std::pair< unsigned int, unsigned int >', 'band')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand & rxPower) [member function]
     cls.add_method('AddForeignSignal', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', 'rxPower')])
     ## 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::PhyEntity::SnrPer', 
@@ -3982,10 +3987,10 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -4071,11 +4076,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4148,6 +4148,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -4168,11 +4173,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -4241,11 +4255,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4362,11 +4371,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4559,11 +4563,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -8120,6 +8119,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -8147,6 +8151,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -8407,6 +8416,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -10393,10 +10407,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -11643,10 +11657,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, ns3::Time rxDuration) [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'), param('ns3::Time', 'rxDuration')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -11927,10 +11941,10 @@
     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]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPowersW')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
@@ -12365,6 +12379,11 @@
     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 >', 
@@ -12390,6 +12409,11 @@
                    'uint16_t', 
                    [], 
                    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, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
@@ -13472,8 +13496,6 @@
     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', 
@@ -13499,9 +13521,9 @@
                    '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]
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand const & ns3::Event::GetRxPowerWPerBand() const [member function]
     cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   'ns3::RxPowerWattPerChannelBand const &', 
                    [], 
                    is_const=True)
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
@@ -13514,10 +13536,10 @@
                    'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand const & rxPower) [member function]
     cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -15438,6 +15460,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -15472,6 +15499,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -16128,11 +16160,6 @@
                    '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', 
@@ -16220,11 +16247,6 @@
                    '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', 
@@ -16262,10 +16284,10 @@
     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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -16296,10 +16318,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -16321,10 +16343,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -16451,10 +16473,10 @@
                    '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]
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')], 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')], 
                    visibility='protected')
     return
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/netanim/bindings/modulegen__gcc_LP64.py ns-3.35/src/netanim/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/netanim/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/netanim/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -33,7 +33,7 @@
     ## 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_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_80211p', '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]
@@ -916,9 +916,15 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )', 'ns3::WifiPhy::MonitorSnifferTxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferTxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferTxCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::WifiPhy::PhyTxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::WifiPhy::PhyTxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::WifiPhy::PhyTxBeginTracedCallback&')
     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::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )', 'ns3::WifiPhy::PhyRxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )*', 'ns3::WifiPhy::PhyRxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )&', 'ns3::WifiPhy::PhyRxBeginTracedCallback&')
     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&')
@@ -1391,7 +1397,7 @@
     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::pair< unsigned int, unsigned int >, double >', ('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('std::list< ns3::LteRrcSap::SrbToAddMod >', 'ns3::LteRrcSap::SrbToAddMod', container_type='list')
     module.add_container('std::list< ns3::LteRrcSap::DrbToAddMod >', 'ns3::LteRrcSap::DrbToAddMod', container_type='list')
@@ -1417,7 +1423,7 @@
     module.add_container('std::vector< int >', 'int', container_type='vector')
     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')
-    module.add_container('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::vector< ns3::BandInfo >', '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')
@@ -1430,7 +1436,6 @@
     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')
@@ -3918,18 +3923,18 @@
     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 const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [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 const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
                    [param('std::pair< unsigned int, unsigned int >', 'band')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand & rxPower) [member function]
     cls.add_method('AddForeignSignal', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', 'rxPower')])
     ## 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::PhyEntity::SnrPer', 
@@ -3982,10 +3987,10 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -4071,11 +4076,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4148,6 +4148,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -4168,11 +4173,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -4241,11 +4255,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4362,11 +4371,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4559,11 +4563,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -8120,6 +8119,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -8147,6 +8151,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -8407,6 +8416,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -10393,10 +10407,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -11643,10 +11657,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, ns3::Time rxDuration) [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'), param('ns3::Time', 'rxDuration')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -11927,10 +11941,10 @@
     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]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPowersW')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
@@ -12365,6 +12379,11 @@
     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 >', 
@@ -12390,6 +12409,11 @@
                    'uint16_t', 
                    [], 
                    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, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
@@ -13472,8 +13496,6 @@
     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', 
@@ -13499,9 +13521,9 @@
                    '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]
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand const & ns3::Event::GetRxPowerWPerBand() const [member function]
     cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   'ns3::RxPowerWattPerChannelBand const &', 
                    [], 
                    is_const=True)
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
@@ -13514,10 +13536,10 @@
                    'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand const & rxPower) [member function]
     cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -15438,6 +15460,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -15472,6 +15499,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -16128,11 +16160,6 @@
                    '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', 
@@ -16220,11 +16247,6 @@
                    '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', 
@@ -16262,10 +16284,10 @@
     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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -16296,10 +16318,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -16321,10 +16343,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -16451,10 +16473,10 @@
                    '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]
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')], 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')], 
                    visibility='protected')
     return
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/bindings/modulegen__gcc_ILP32.py ns-3.35/src/network/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/network/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -2426,11 +2426,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2535,11 +2530,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2656,11 +2646,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2853,11 +2838,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/bindings/modulegen__gcc_LP64.py ns-3.35/src/network/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/network/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -2426,11 +2426,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2535,11 +2530,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2656,11 +2646,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2853,11 +2838,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/model/buffer.cc ns-3.35/src/network/model/buffer.cc
--- ns-3.34/src/network/model/buffer.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/model/buffer.cc	2021-10-01 13:26:47.000000000 -0700
@@ -400,8 +400,9 @@
 Buffer::AddAtEnd (const Buffer &o)
 {
   NS_LOG_FUNCTION (this << &o);
+
   if (m_data->m_count == 1 &&
-      m_end == m_zeroAreaEnd &&
+      (m_end == m_zeroAreaEnd || m_zeroAreaStart == m_zeroAreaEnd) &&
       m_end == m_data->m_dirtyEnd &&
       o.m_start == o.m_zeroAreaStart &&
       o.m_zeroAreaEnd - o.m_zeroAreaStart > 0)
@@ -411,8 +412,12 @@
        * we attempt to aggregate two buffers which contain
        * adjacent zero areas.
        */
+      if (m_zeroAreaStart == m_zeroAreaEnd)
+        {
+          m_zeroAreaStart = m_end;
+        }
       uint32_t zeroSize = o.m_zeroAreaEnd - o.m_zeroAreaStart;
-      m_zeroAreaEnd += zeroSize;
+      m_zeroAreaEnd = m_end + zeroSize;
       m_end = m_zeroAreaEnd;
       m_data->m_dirtyEnd = m_zeroAreaEnd;
       uint32_t endData = o.m_end - o.m_zeroAreaEnd;
@@ -812,14 +817,10 @@
 Buffer::Iterator::CheckNoZero (uint32_t start, uint32_t end) const
 {
   NS_LOG_FUNCTION (this << &start << &end);
-  for (uint32_t i = start; i < end; i++)
-    {
-      if (!Check (i))
-        {
-          return false;
-        }
-    }
-  return true;
+  return !(start < m_dataStart ||
+           end > m_dataEnd ||
+           (end > m_zeroStart && start < m_zeroEnd && m_zeroEnd != m_zeroStart && start != end)
+           );
 }
 bool 
 Buffer::Iterator::Check (uint32_t i) const
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/utils/ipv4-address.cc ns-3.35/src/network/utils/ipv4-address.cc
--- ns-3.34/src/network/utils/ipv4-address.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/utils/ipv4-address.cc	2021-10-01 13:26:47.000000000 -0700
@@ -110,17 +110,6 @@
 }
 
 bool 
-Ipv4Mask::IsEqual (Ipv4Mask other) const
-{
-  NS_LOG_FUNCTION (this << other);
-  if (other.m_mask == m_mask) {
-      return true;
-    } else {
-      return false;
-    }
-}
-
-bool 
 Ipv4Mask::IsMatch (Ipv4Address a, Ipv4Address b) const
 {
   NS_LOG_FUNCTION (this << a << b);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/utils/ipv4-address.h ns-3.35/src/network/utils/ipv4-address.h
--- ns-3.34/src/network/utils/ipv4-address.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/utils/ipv4-address.h	2021-10-01 13:26:47.000000000 -0700
@@ -77,19 +77,6 @@
     */
   void Set (char const *address);
   /**
-   * \brief Comparison operation between two Ipv4Addresses
-   *
-   * \deprecated Use the == operator (same functionality)
-   *
-   * \param other address to which to compare this address
-   * \return True if the addresses are equal. False otherwise.
-   */
-  NS_DEPRECATED_3_31
-  bool IsEqual (const Ipv4Address &other) const
-  {
-    return m_address == other.m_address;
-  }
-  /**
    * Serialize this address to a 4-byte buffer
    *
    * \param buf output buffer to which this address gets overwritten with this
@@ -289,15 +276,6 @@
    * corresponding to this mask
    */
   bool IsMatch (Ipv4Address a, Ipv4Address b) const;
-  /**
-   *
-   * \deprecated Use the == operator (same functionality)
-   *
-   * \param other a mask to compare 
-   * \return true if the mask equals the mask passed as input parameter
-   */
-  NS_DEPRECATED_3_31
-  bool IsEqual (Ipv4Mask other) const;
   /** 
    * Get the host-order 32-bit IP mask
    * \return the host-order 32-bit IP mask
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/utils/ipv6-address.cc ns-3.35/src/network/utils/ipv6-address.cc
--- ns-3.34/src/network/utils/ipv6-address.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/utils/ipv6-address.cc	2021-10-01 13:26:47.000000000 -0700
@@ -925,16 +925,6 @@
   return false;
 }
 
-bool Ipv6Address::IsEqual (const Ipv6Address& other) const
-{
-  NS_LOG_FUNCTION (this << other);
-  if (!memcmp (m_address, other.m_address, 16))
-    {
-      return true;
-    }
-  return false;
-}
-
 bool Ipv6Address::IsInitialized (void) const
 {
   NS_LOG_FUNCTION (this);
@@ -1156,15 +1146,6 @@
   return 128 - prefixLength;
 }
 
-bool Ipv6Prefix::IsEqual (const Ipv6Prefix& other) const
-{
-  if (!memcmp (m_prefix, other.m_prefix, 16))
-    {
-      return true;
-    }
-  return false;
-}
-
 std::ostream& operator << (std::ostream& os, Ipv6Prefix const& prefix)
 {
   prefix.Print (os);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/utils/ipv6-address.h ns-3.35/src/network/utils/ipv6-address.h
--- ns-3.34/src/network/utils/ipv6-address.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/utils/ipv6-address.h	2021-10-01 13:26:47.000000000 -0700
@@ -99,17 +99,6 @@
   void Set (uint8_t address[16]);
 
   /**
-   * \brief Comparison operation between two Ipv6Addresses.
-   *
-   * \deprecated Use the == operator (same functionality)
-   *
-   * \param other the IPv6 address to which to compare this address
-   * \return true if the addresses are equal, false otherwise
-   */
-  NS_DEPRECATED_3_31
-  bool IsEqual (const Ipv6Address& other) const;
-
-  /**
    * \brief Serialize this address to a 16-byte buffer.
    * \param buf the output buffer to which this address gets overwritten with this
    * Ipv6Address
@@ -568,17 +557,6 @@
   uint8_t GetMinimumPrefixLength () const;
 
   /**
-   * \brief Comparison operation between two Ipv6Prefix.
-   *
-   * \deprecated Use the == operator (same functionality)
-   *
-   * \param other the IPv6 prefix to which to compare this prefix
-   * \return true if the prefixes are equal, false otherwise
-   */
-  NS_DEPRECATED_3_31
-  bool IsEqual (const Ipv6Prefix& other) const;
-
-  /**
    * \brief Print this address to the given output stream.
    *
    * The print format is in the typical "2001:660:4701::1".
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/utils/pcap-file-wrapper.cc ns-3.35/src/network/utils/pcap-file-wrapper.cc
--- ns-3.34/src/network/utils/pcap-file-wrapper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/utils/pcap-file-wrapper.cc	2021-10-01 13:26:47.000000000 -0700
@@ -184,10 +184,9 @@
   uint32_t origLen;
   uint32_t readLen;
 
-  uint32_t maxBytes=65536;
-  uint8_t  datbuf[maxBytes];
+  uint8_t  datbuf[65536];
 
-  m_file.Read (datbuf,maxBytes,tsSec,tsUsec,inclLen,origLen,readLen);
+  m_file.Read (datbuf,65536,tsSec,tsUsec,inclLen,origLen,readLen);
 
   if (m_file.Fail())
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/network/utils/sequence-number.h ns-3.35/src/network/utils/sequence-number.h
--- ns-3.34/src/network/utils/sequence-number.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/network/utils/sequence-number.h	2021-10-01 13:26:47.000000000 -0700
@@ -151,7 +151,7 @@
 
    /**
    * \brief Postfix decrement operator
-   * \returns incremented sequence number
+   * \returns decremented sequence number
    */ 
   SequenceNumber<NUMERIC_TYPE, SIGNED_TYPE> operator-- (int)
   {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/bindings/callbacks_list.py ns-3.35/src/nix-vector-routing/bindings/callbacks_list.py
--- ns-3.34/src/nix-vector-routing/bindings/callbacks_list.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/bindings/callbacks_list.py	2021-10-01 13:26:47.000000000 -0700
@@ -8,4 +8,10 @@
     ['void', 'ns3::Ptr<ns3::Socket>', 'unsigned int', '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', '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'],
+    ['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'],
 ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -61,8 +61,6 @@
     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::Ipv4Route> [struct]
-    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Ipv4Route'])
     ## 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::Packet> [struct]
@@ -101,8 +99,16 @@
     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')
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper [class]
+    module.add_class('Ipv6RoutingHelper', allow_subclassing=True, import_from_module='ns.internet')
     ## 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')
@@ -206,8 +212,14 @@
     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')
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper [class]
-    module.add_class('Ipv4NixVectorHelper', parent=root_module['ns3::Ipv4RoutingHelper'])
+    ## 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]
@@ -228,6 +240,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::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::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > [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::Ipv6MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > [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::Ipv6Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6Route>'])
     ## 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]
@@ -290,6 +306,21 @@
     module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
     module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4Interface [class]
+    module.add_class('Ipv4Interface', import_from_module='ns.internet', parent=root_module['ns3::Object'])
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol [class]
+    module.add_class('Ipv4L3Protocol', import_from_module='ns.internet', parent=root_module['ns3::Ipv4'])
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol::DropReason [enumeration]
+    module.add_enum('DropReason', ['DROP_TTL_EXPIRED', 'DROP_NO_ROUTE', 'DROP_BAD_CHECKSUM', 'DROP_INTERFACE_DOWN', 'DROP_ROUTE_ERROR', 'DROP_FRAGMENT_TIMEOUT', 'DROP_DUPLICATE'], outer_class=root_module['ns3::Ipv4L3Protocol'], import_from_module='ns.internet')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )', 'ns3::Ipv4L3Protocol::SentTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )*', 'ns3::Ipv4L3Protocol::SentTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )&', 'ns3::Ipv4L3Protocol::SentTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv4 >, uint32_t )', 'ns3::Ipv4L3Protocol::TxRxTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv4 >, uint32_t )*', 'ns3::Ipv4L3Protocol::TxRxTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv4 >, uint32_t )&', 'ns3::Ipv4L3Protocol::TxRxTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, uint32_t )', 'ns3::Ipv4L3Protocol::DropTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, uint32_t )*', 'ns3::Ipv4L3Protocol::DropTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, uint32_t )&', 'ns3::Ipv4L3Protocol::DropTracedCallback&')
     ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
     module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
@@ -312,14 +343,51 @@
     typehandlers.add_type_alias('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 >', 'ns3::Ipv4RoutingProtocol::ErrorCallback')
     typehandlers.add_type_alias('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 >*', 'ns3::Ipv4RoutingProtocol::ErrorCallback*')
     typehandlers.add_type_alias('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 >&', 'ns3::Ipv4RoutingProtocol::ErrorCallback&')
+    ## 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-interface.h (module 'internet'): ns3::Ipv6Interface [class]
+    module.add_class('Ipv6Interface', import_from_module='ns.internet', parent=root_module['ns3::Object'])
+    ## 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-route.h (module 'internet'): ns3::Ipv6MulticastRoute [class]
+    module.add_class('Ipv6MulticastRoute', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >'])
+    ## 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]
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Route [class]
+    module.add_class('Ipv6Route', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >'])
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ipv6RoutingProtocol [class]
+    module.add_class('Ipv6RoutingProtocol', import_from_module='ns.internet', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::UnicastForwardCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::UnicastForwardCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::UnicastForwardCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::MulticastForwardCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::MulticastForwardCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::MulticastForwardCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::LocalDeliverCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::LocalDeliverCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::LocalDeliverCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::ErrorCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::ErrorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::ErrorCallback&')
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker [class]
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
@@ -391,6 +459,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<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<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, 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::Ipv4>, 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::Ipv4>', '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]
@@ -403,17 +483,23 @@
     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'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorRouting [class]
-    module.add_class('Ipv4NixVectorRouting', parent=root_module['ns3::Ipv4RoutingProtocol'])
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting [class]
+    module.add_class('Ipv6ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv6RoutingProtocol'])
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     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('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::NixVector > >', 'ns3::NixMap_t')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::NixVector > >*', 'ns3::NixMap_t*')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::NixVector > >&', 'ns3::NixMap_t&')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::Ipv4Route > >', 'ns3::Ipv4RouteMap_t')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::Ipv4Route > >*', 'ns3::Ipv4RouteMap_t*')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::Ipv4Route > >&', 'ns3::Ipv4RouteMap_t&')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >', 'ns3::Ipv4NixVectorRouting')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >*', 'ns3::Ipv4NixVectorRouting*')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >&', 'ns3::Ipv4NixVectorRouting&')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv6RoutingProtocol >', 'ns3::Ipv6NixVectorRouting')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv6RoutingProtocol >*', 'ns3::Ipv6NixVectorRouting*')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv6RoutingProtocol >&', 'ns3::Ipv6NixVectorRouting&')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv4RoutingHelper >', 'ns3::Ipv4NixVectorHelper')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv4RoutingHelper >*', 'ns3::Ipv4NixVectorHelper*')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv4RoutingHelper >&', 'ns3::Ipv4NixVectorHelper&')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv6RoutingHelper >', 'ns3::Ipv6NixVectorHelper')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv6RoutingHelper >*', 'ns3::Ipv6NixVectorHelper*')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv6RoutingHelper >&', 'ns3::Ipv6NixVectorHelper&')
     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&')
@@ -498,7 +584,6 @@
     register_Ns3DefaultDeleter__Ns3CallbackImplBase_methods(root_module, root_module['ns3::DefaultDeleter< ns3::CallbackImplBase >'])
     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__Ns3Ipv4Route_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Ipv4Route >'])
     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__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
@@ -513,7 +598,9 @@
     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_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Ipv6RoutingHelper_methods(root_module, root_module['ns3::Ipv6RoutingHelper'])
     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'])
@@ -545,7 +632,7 @@
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Ipv4Header_methods(root_module, root_module['ns3::Ipv4Header'])
-    register_Ns3Ipv4NixVectorHelper_methods(root_module, root_module['ns3::Ipv4NixVectorHelper'])
+    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_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
@@ -556,6 +643,8 @@
     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__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >'])
+    register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >'])
     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> >'])
@@ -583,15 +672,24 @@
     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'])
+    register_Ns3Ipv4Interface_methods(root_module, root_module['ns3::Ipv4Interface'])
+    register_Ns3Ipv4L3Protocol_methods(root_module, root_module['ns3::Ipv4L3Protocol'])
     register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
     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_Ns3Ipv4RoutingProtocol_methods(root_module, root_module['ns3::Ipv4RoutingProtocol'])
+    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_Ns3Ipv6Interface_methods(root_module, root_module['ns3::Ipv6Interface'])
+    register_Ns3Ipv6L3Protocol_methods(root_module, root_module['ns3::Ipv6L3Protocol'])
+    register_Ns3Ipv6MulticastRoute_methods(root_module, root_module['ns3::Ipv6MulticastRoute'])
+    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_Ns3Ipv6Route_methods(root_module, root_module['ns3::Ipv6Route'])
+    register_Ns3Ipv6RoutingProtocol_methods(root_module, root_module['ns3::Ipv6RoutingProtocol'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
@@ -610,13 +708,19 @@
     register_Ns3BridgeNetDevice_methods(root_module, root_module['ns3::BridgeNetDevice'])
     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_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_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv4__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::Ipv4>, 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 >'])
     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_Ns3Ipv4ListRouting_methods(root_module, root_module['ns3::Ipv4ListRouting'])
-    register_Ns3Ipv4NixVectorRouting_methods(root_module, root_module['ns3::Ipv4NixVectorRouting'])
+    register_Ns3Ipv6ListRouting_methods(root_module, root_module['ns3::Ipv6ListRouting'])
     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'])
@@ -1185,18 +1289,6 @@
                    is_static=True)
     return
 
-def register_Ns3DefaultDeleter__Ns3Ipv4Route_methods(root_module, cls):
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Ipv4Route>::DefaultDeleter() [constructor]
-    cls.add_constructor([])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Ipv4Route>::DefaultDeleter(ns3::DefaultDeleter<ns3::Ipv4Route> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DefaultDeleter< ns3::Ipv4Route > const &', 'arg0')])
-    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::Ipv4Route>::Delete(ns3::Ipv4Route * object) [member function]
-    cls.add_method('Delete', 
-                   'void', 
-                   [param('ns3::Ipv4Route *', '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([])
@@ -1475,11 +1567,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1552,6 +1639,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1572,11 +1664,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1645,11 +1746,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1823,11 +1919,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1965,6 +2056,77 @@
                    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('==')
@@ -2020,11 +2182,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -2041,6 +2198,63 @@
                    [param('uint8_t', 'prefixLength')])
     return
 
+def register_Ns3Ipv6RoutingHelper_methods(root_module, cls):
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper::Ipv6RoutingHelper() [constructor]
+    cls.add_constructor([])
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper::Ipv6RoutingHelper(ns3::Ipv6RoutingHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6RoutingHelper const &', 'arg0')])
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper * ns3::Ipv6RoutingHelper::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ipv6RoutingHelper *', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6RoutingHelper::Create(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheAllAt(ns3::Time printTime, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheAllAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheAllEvery(ns3::Time printInterval, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheAllEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheAt(ns3::Time printTime, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheEvery(ns3::Time printInterval, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableAllAt(ns3::Time printTime, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableAllAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableAllEvery(ns3::Time printInterval, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableAllEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableAt(ns3::Time printTime, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableEvery(ns3::Time printInterval, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    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')])
@@ -2431,6 +2645,8 @@
     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 const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3608,25 +3824,152 @@
                    [param('uint8_t', 'ttl')])
     return
 
-def register_Ns3Ipv4NixVectorHelper_methods(root_module, cls):
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper() [constructor]
+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([])
-    ## 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 *', 
+    ## 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::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestinationAddress() const [member function]
+    cls.add_method('GetDestinationAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   deprecated=True, 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)
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ptr<ns3::Ipv4RoutingProtocol> ns3::Ipv4NixVectorHelper::Create(ns3::Ptr<ns3::Node> node) const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+    ## 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::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
+    cls.add_method('GetSourceAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   deprecated=True, 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)
-    ## 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', 
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestinationAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
+    ## 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('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')])
+                   [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSourceAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
+    ## 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):
@@ -3766,6 +4109,20 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6MulticastRoute > > const &', 'o')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6Route > > 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([])
@@ -4667,6 +5024,36 @@
                    '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::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')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5078,42 +5465,379 @@
                    [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]
+def register_Ns3Ipv4Interface_methods(root_module, cls):
+    ## ipv4-interface.h (module 'internet'): static ns3::TypeId ns3::Ipv4Interface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4Interface::Ipv4Interface() [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 >', 
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetTrafficControl(ns3::Ptr<ns3::TrafficControlLayer> tc) [member function]
+    cls.add_method('SetTrafficControl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TrafficControlLayer >', 'tc')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
+    cls.add_method('SetArpCache', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
+    ## ipv4-interface.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4Interface::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   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', 
-                   '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)
+    ## ipv4-interface.h (module 'internet'): ns3::Ptr<ns3::ArpCache> ns3::Ipv4Interface::GetArpCache() const [member function]
+    cls.add_method('GetArpCache', 
+                   'ns3::Ptr< ns3::ArpCache >', 
                    [], 
                    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', 
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetMetric(uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint16_t', 'metric')])
+    ## ipv4-interface.h (module 'internet'): uint16_t ns3::Ipv4Interface::GetMetric() const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::IsUp() const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::IsDown() const [member function]
+    cls.add_method('IsDown', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetUp() [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDown() [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [])
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::IsForwarding() const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetForwarding(bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('bool', 'val')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::Send(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & hdr, ns3::Ipv4Address dest) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'hdr'), param('ns3::Ipv4Address', 'dest')])
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::AddAddress(ns3::Ipv4InterfaceAddress address) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('ns3::Ipv4InterfaceAddress', 'address')])
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4Interface::GetAddress(uint32_t index) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): uint32_t ns3::Ipv4Interface::GetNAddresses() const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4Interface::RemoveAddress(uint32_t index) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('uint32_t', 'index')])
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4Interface::RemoveAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('ns3::Ipv4Address', 'address')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3Ipv4L3Protocol_methods(root_module, cls):
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol::Ipv4L3Protocol() [constructor]
+    cls.add_constructor([])
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::AddAddress(uint32_t i, ns3::Ipv4InterfaceAddress address) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv4L3Protocol::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddInterface', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::Ipv4L3Protocol::CreateRawSocket() [member function]
+    cls.add_method('CreateRawSocket', 
+                   'ns3::Ptr< ns3::Socket >', 
+                   [], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::DeleteRawSocket(ns3::Ptr<ns3::Socket> socket) [member function]
+    cls.add_method('DeleteRawSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Socket >', 'socket')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv4Interface> ns3::Ipv4L3Protocol::GetInterface(uint32_t i) const [member function]
+    cls.add_method('GetInterface', 
+                   'ns3::Ptr< ns3::Ipv4Interface >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## ipv4-l3-protocol.h (module 'internet'): int32_t ns3::Ipv4L3Protocol::GetInterfaceForAddress(ns3::Ipv4Address addr) const [member function]
+    cls.add_method('GetInterfaceForAddress', 
+                   'int32_t', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): int32_t ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): int32_t ns3::Ipv4L3Protocol::GetInterfaceForPrefix(ns3::Ipv4Address addr, ns3::Ipv4Mask mask) const [member function]
+    cls.add_method('GetInterfaceForPrefix', 
+                   'int32_t', 
+                   [param('ns3::Ipv4Address', 'addr'), param('ns3::Ipv4Mask', 'mask')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv4L3Protocol::GetMetric(uint32_t i) const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv4L3Protocol::GetMtu(uint32_t i) const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv4L3Protocol::GetNAddresses(uint32_t interface) const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv4L3Protocol::GetNInterfaces() const [member function]
+    cls.add_method('GetNInterfaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4L3Protocol::GetNetDevice(uint32_t i) [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4L3Protocol::GetProtocol(int protocolNumber) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv4RoutingProtocol> ns3::Ipv4L3Protocol::GetRoutingProtocol() const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv4L3Protocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsForwarding(uint32_t i) const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUnicast(ns3::Ipv4Address ad) const [member function]
+    cls.add_method('IsUnicast', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'ad')], 
+                   is_const=True)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUp(uint32_t i) const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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')])
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetDefaultTtl(uint8_t ttl) [member function]
+    cls.add_method('SetDefaultTtl', 
+                   'void', 
+                   [param('uint8_t', 'ttl')])
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetDown(uint32_t i) [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetForwarding(uint32_t i, bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('uint32_t', 'i'), param('bool', 'val')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetRoutingProtocol(ns3::Ptr<ns3::Ipv4RoutingProtocol> routingProtocol) [member function]
+    cls.add_method('SetRoutingProtocol', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Ipv4RoutingProtocol >', 'routingProtocol')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetUp(uint32_t i) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol::PROT_NUMBER [variable]
+    cls.add_static_attribute('PROT_NUMBER', 'uint16_t const', is_const=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::GetIpForward() const [member function]
+    cls.add_method('GetIpForward', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::GetWeakEsModel() const [member function]
+    cls.add_method('GetWeakEsModel', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetIpForward(bool forward) [member function]
+    cls.add_method('SetIpForward', 
+                   'void', 
+                   [param('bool', 'forward')], 
+                   is_virtual=True, visibility='private')
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetWeakEsModel(bool model) [member function]
+    cls.add_method('SetWeakEsModel', 
+                   'void', 
+                   [param('bool', 'model')], 
+                   is_virtual=True, visibility='private')
+    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 >', 
+                   [], 
+                   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', 
+                   '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)
+    ## 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', 
                    'void', 
                    [param('ns3::Ipv4Mask const &', 'value')])
     return
@@ -5171,176 +5895,1004 @@
     cls.add_constructor([param('ns3::Ipv4Route const &', 'arg0')])
     ## ipv4-route.h (module 'internet'): ns3::Ipv4Route::Ipv4Route() [constructor]
     cls.add_constructor([])
-    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetDestination() const [member function]
+    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetGateway() const [member function]
+    cls.add_method('GetGateway', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4Route::GetOutputDevice() const [member function]
+    cls.add_method('GetOutputDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetDestination(ns3::Ipv4Address dest) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'dest')])
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetGateway(ns3::Ipv4Address gw) [member function]
+    cls.add_method('SetGateway', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'gw')])
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetOutputDevice(ns3::Ptr<ns3::NetDevice> outputDevice) [member function]
+    cls.add_method('SetOutputDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'outputDevice')])
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetSource(ns3::Ipv4Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'src')])
+    return
+
+def register_Ns3Ipv4RoutingProtocol_methods(root_module, cls):
+    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol() [constructor]
+    cls.add_constructor([])
+    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol(ns3::Ipv4RoutingProtocol const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4RoutingProtocol const &', 'arg0')])
+    ## ipv4-routing-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv4RoutingProtocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+    cls.add_method('NotifyAddAddress', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   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_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_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_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_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_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_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_pure_virtual=True, is_virtual=True)
+    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([])
+    ## 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)
+    ## 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('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6Interface_methods(root_module, cls):
+    ## ipv6-interface.h (module 'internet'): static ns3::TypeId ns3::Ipv6Interface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6Interface::Ipv6Interface() [constructor]
+    cls.add_constructor([])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetTrafficControl(ns3::Ptr<ns3::TrafficControlLayer> tc) [member function]
+    cls.add_method('SetTrafficControl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TrafficControlLayer >', 'tc')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6Interface::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetMetric(uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint16_t', 'metric')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetMetric() const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsUp() const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsDown() const [member function]
+    cls.add_method('IsDown', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetUp() [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetDown() [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [])
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsForwarding() const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetForwarding(bool forward) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('bool', 'forward')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetCurHopLimit(uint8_t curHopLimit) [member function]
+    cls.add_method('SetCurHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'curHopLimit')])
+    ## ipv6-interface.h (module 'internet'): uint8_t ns3::Ipv6Interface::GetCurHopLimit() const [member function]
+    cls.add_method('GetCurHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetBaseReachableTime(uint16_t baseReachableTime) [member function]
+    cls.add_method('SetBaseReachableTime', 
+                   'void', 
+                   [param('uint16_t', 'baseReachableTime')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetBaseReachableTime() const [member function]
+    cls.add_method('GetBaseReachableTime', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetReachableTime(uint16_t reachableTime) [member function]
+    cls.add_method('SetReachableTime', 
+                   'void', 
+                   [param('uint16_t', 'reachableTime')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetReachableTime() const [member function]
+    cls.add_method('GetReachableTime', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetRetransTimer(uint16_t retransTimer) [member function]
+    cls.add_method('SetRetransTimer', 
+                   'void', 
+                   [param('uint16_t', 'retransTimer')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetRetransTimer() const [member function]
+    cls.add_method('GetRetransTimer', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::Send(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & hdr, ns3::Ipv6Address dest) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'hdr'), param('ns3::Ipv6Address', 'dest')])
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::AddAddress(ns3::Ipv6InterfaceAddress iface) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6InterfaceAddress', 'iface')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::GetLinkLocalAddress() const [member function]
+    cls.add_method('GetLinkLocalAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsSolicitedMulticastAddress(ns3::Ipv6Address address) const [member function]
+    cls.add_method('IsSolicitedMulticastAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::GetAddress(uint32_t index) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::GetAddressMatchingDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('GetAddressMatchingDestination', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-interface.h (module 'internet'): uint32_t ns3::Ipv6Interface::GetNAddresses() const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::RemoveAddress(uint32_t index) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'index')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::RemoveAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetState(ns3::Ipv6Address address, ns3::Ipv6InterfaceAddress::State_e state) [member function]
+    cls.add_method('SetState', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6InterfaceAddress::State_e', 'state')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetNsDadUid(ns3::Ipv6Address address, uint32_t uid) [member function]
+    cls.add_method('SetNsDadUid', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'uid')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ptr<ns3::NdiscCache> ns3::Ipv6Interface::GetNdiscCache() const [member function]
+    cls.add_method('GetNdiscCache', 
+                   'ns3::Ptr< ns3::NdiscCache >', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    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_Ns3Ipv6MulticastRoute_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::Ipv6MulticastRoute(ns3::Ipv6MulticastRoute const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6MulticastRoute const &', 'arg0')])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::Ipv6MulticastRoute() [constructor]
+    cls.add_constructor([])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6MulticastRoute::GetGroup() const [member function]
+    cls.add_method('GetGroup', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6MulticastRoute::GetOrigin() const [member function]
+    cls.add_method('GetOrigin', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
+    cls.add_method('GetOutputTtlMap', 
+                   'std::map< unsigned int, unsigned int >', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): uint32_t ns3::Ipv6MulticastRoute::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetGroup(ns3::Ipv6Address const group) [member function]
+    cls.add_method('SetGroup', 
+                   'void', 
+                   [param('ns3::Ipv6Address const', 'group')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetOrigin(ns3::Ipv6Address const origin) [member function]
+    cls.add_method('SetOrigin', 
+                   'void', 
+                   [param('ns3::Ipv6Address const', 'origin')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetOutputTtl(uint32_t oif, uint32_t ttl) [member function]
+    cls.add_method('SetOutputTtl', 
+                   'void', 
+                   [param('uint32_t', 'oif'), param('uint32_t', 'ttl')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetParent(uint32_t iif) [member function]
+    cls.add_method('SetParent', 
+                   'void', 
+                   [param('uint32_t', 'iif')])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::MAX_INTERFACES [variable]
+    cls.add_static_attribute('MAX_INTERFACES', 'uint32_t const', is_const=True)
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::MAX_TTL [variable]
+    cls.add_static_attribute('MAX_TTL', 'uint32_t const', is_const=True)
+    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([])
+    ## 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)
+    ## 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)
+    ## 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_Ns3Ipv6Route_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Route::Ipv6Route(ns3::Ipv6Route const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Route const &', 'arg0')])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Route::Ipv6Route() [constructor]
+    cls.add_constructor([])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Route::GetDestination() const [member function]
     cls.add_method('GetDestination', 
-                   'ns3::Ipv4Address', 
+                   'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetGateway() const [member function]
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Route::GetGateway() const [member function]
     cls.add_method('GetGateway', 
-                   'ns3::Ipv4Address', 
+                   'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4Route::GetOutputDevice() const [member function]
+    ## ipv6-route.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6Route::GetOutputDevice() const [member function]
     cls.add_method('GetOutputDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetSource() const [member function]
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Route::GetSource() const [member function]
     cls.add_method('GetSource', 
-                   'ns3::Ipv4Address', 
+                   'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetDestination(ns3::Ipv4Address dest) [member function]
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetDestination(ns3::Ipv6Address dest) [member function]
     cls.add_method('SetDestination', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetGateway(ns3::Ipv4Address gw) [member function]
+                   [param('ns3::Ipv6Address', 'dest')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetGateway(ns3::Ipv6Address gw) [member function]
     cls.add_method('SetGateway', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'gw')])
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetOutputDevice(ns3::Ptr<ns3::NetDevice> outputDevice) [member function]
+                   [param('ns3::Ipv6Address', 'gw')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetOutputDevice(ns3::Ptr<ns3::NetDevice> outputDevice) [member function]
     cls.add_method('SetOutputDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'outputDevice')])
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetSource(ns3::Ipv4Address src) [member function]
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetSource(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSource', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')])
     return
 
-def register_Ns3Ipv4RoutingProtocol_methods(root_module, cls):
-    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol() [constructor]
+def register_Ns3Ipv6RoutingProtocol_methods(root_module, cls):
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ipv6RoutingProtocol::Ipv6RoutingProtocol() [constructor]
     cls.add_constructor([])
-    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol(ns3::Ipv4RoutingProtocol const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4RoutingProtocol const &', 'arg0')])
-    ## ipv4-routing-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv4RoutingProtocol::GetTypeId() [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ipv6RoutingProtocol::Ipv6RoutingProtocol(ns3::Ipv6RoutingProtocol const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6RoutingProtocol const &', 'arg0')])
+    ## ipv6-routing-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv6RoutingProtocol::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyAddAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyAddRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyAddRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
                    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]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyRemoveAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyRemoveAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
                    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]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyRemoveRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyRemoveRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::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_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]
+    ## ipv6-routing-protocol.h (module 'internet'): bool ns3::Ipv6RoutingProtocol::RouteInput(ns3::Ptr<const ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<const ns3::NetDevice> idev, ns3::Ipv6RoutingProtocol::UnicastForwardCallback ucb, ns3::Ipv6RoutingProtocol::MulticastForwardCallback mcb, ns3::Ipv6RoutingProtocol::LocalDeliverCallback lcb, ns3::Ipv6RoutingProtocol::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')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header 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::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], 
                    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]
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv6Route> ns3::Ipv6RoutingProtocol::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header 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')], 
+                   'ns3::Ptr< ns3::Ipv6Route >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
                    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', 
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::SetIpv6(ns3::Ptr<ns3::Ipv6> ipv6) [member function]
+    cls.add_method('SetIpv6', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], 
+                   [param('ns3::Ptr< ns3::Ipv6 >', 'ipv6')], 
                    is_pure_virtual=True, is_virtual=True)
     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)
-    ## 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('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')])
-    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)
-    ## 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)
-    ## 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_Ns3Mac48AddressChecker_methods(root_module, cls):
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
     cls.add_constructor([])
@@ -6252,6 +7804,138 @@
                    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([])
+    ## 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(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> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string 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>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string 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>::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::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv4Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, ns3::Ipv4L3Protocol::DropReason arg2, ns3::Ptr<ns3::Ipv4> arg3, unsigned int arg4) [member operator]
+    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_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):
+    ## 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>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## 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>::CallbackImpl(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> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv4Header 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::Ipv4Header &, 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::Ipv4Header &, 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::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv4Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, unsigned int arg2) [member operator]
+    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_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__ns3Ipv4__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::Ipv4>, 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::Ipv4>, 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::Ipv4>, 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::Ipv4 >, 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::Ipv4>, 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::Ipv4>, 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::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Ptr<ns3::Ipv4> arg1, unsigned int arg2) [member operator]
+    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_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([])
@@ -6439,75 +8123,86 @@
                    is_virtual=True, visibility='protected')
     return
 
-def register_Ns3Ipv4NixVectorRouting_methods(root_module, cls):
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorRouting::Ipv4NixVectorRouting(ns3::Ipv4NixVectorRouting const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4NixVectorRouting const &', 'arg0')])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorRouting::Ipv4NixVectorRouting() [constructor]
+def register_Ns3Ipv6ListRouting_methods(root_module, cls):
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting::Ipv6ListRouting(ns3::Ipv6ListRouting const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6ListRouting const &', 'arg0')])
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting::Ipv6ListRouting() [constructor]
     cls.add_constructor([])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::FlushGlobalNixRoutingCache() const [member function]
-    cls.add_method('FlushGlobalNixRoutingCache', 
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::AddRoutingProtocol(ns3::Ptr<ns3::Ipv6RoutingProtocol> routingProtocol, int16_t priority) [member function]
+    cls.add_method('AddRoutingProtocol', 
                    'void', 
+                   [param('ns3::Ptr< ns3::Ipv6RoutingProtocol >', 'routingProtocol'), param('int16_t', 'priority')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): uint32_t ns3::Ipv6ListRouting::GetNRoutingProtocols() const [member function]
+    cls.add_method('GetNRoutingProtocols', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): static ns3::TypeId ns3::Ipv4NixVectorRouting::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6ListRouting::GetRoutingProtocol(uint32_t index, int16_t & priority) const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [param('uint32_t', 'index'), param('int16_t &', 'priority')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): static ns3::TypeId ns3::Ipv6ListRouting::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    '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', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyAddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyAddAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyInterfaceDown(uint32_t interface) [member function]
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyAddRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyAddRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyInterfaceDown(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyInterfaceUp(uint32_t interface) [member function]
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyInterfaceUp(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyRemoveAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyRemoveAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::PrintRoutingTable(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) const [member function]
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyRemoveRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyRemoveRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::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, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): bool ns3::Ipv4NixVectorRouting::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]
+                   is_const=True, is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): bool ns3::Ipv6ListRouting::RouteInput(ns3::Ptr<const ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<const ns3::NetDevice> idev, ns3::Ipv6RoutingProtocol::UnicastForwardCallback ucb, ns3::Ipv6RoutingProtocol::MulticastForwardCallback mcb, ns3::Ipv6RoutingProtocol::LocalDeliverCallback lcb, ns3::Ipv6RoutingProtocol::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, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ptr<ns3::Ipv4Route> ns3::Ipv4NixVectorRouting::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::NetDevice> oif, ns3::Socket::SocketErrno & sockerr) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header 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::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ptr<ns3::Ipv6Route> ns3::Ipv6ListRouting::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header 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, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::SetIpv4(ns3::Ptr<ns3::Ipv4> ipv4) [member function]
-    cls.add_method('SetIpv4', 
+                   'ns3::Ptr< ns3::Ipv6Route >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::SetIpv6(ns3::Ptr<ns3::Ipv6> ipv6) [member function]
+    cls.add_method('SetIpv6', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::Ipv6 >', 'ipv6')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -61,8 +61,6 @@
     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::Ipv4Route> [struct]
-    module.add_class('DefaultDeleter', import_from_module='ns.core', template_parameters=['ns3::Ipv4Route'])
     ## 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::Packet> [struct]
@@ -101,8 +99,16 @@
     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')
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper [class]
+    module.add_class('Ipv6RoutingHelper', allow_subclassing=True, import_from_module='ns.internet')
     ## 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')
@@ -206,8 +212,14 @@
     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')
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper [class]
-    module.add_class('Ipv4NixVectorHelper', parent=root_module['ns3::Ipv4RoutingHelper'])
+    ## 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]
@@ -228,6 +240,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::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::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > [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::Ipv6MulticastRoute', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6MulticastRoute>'])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > [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::Ipv6Route', 'ns3::empty', 'ns3::DefaultDeleter<ns3::Ipv6Route>'])
     ## 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]
@@ -290,6 +306,21 @@
     module.add_class('Ipv4AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4AddressValue [class]
     module.add_class('Ipv4AddressValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4Interface [class]
+    module.add_class('Ipv4Interface', import_from_module='ns.internet', parent=root_module['ns3::Object'])
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol [class]
+    module.add_class('Ipv4L3Protocol', import_from_module='ns.internet', parent=root_module['ns3::Ipv4'])
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol::DropReason [enumeration]
+    module.add_enum('DropReason', ['DROP_TTL_EXPIRED', 'DROP_NO_ROUTE', 'DROP_BAD_CHECKSUM', 'DROP_INTERFACE_DOWN', 'DROP_ROUTE_ERROR', 'DROP_FRAGMENT_TIMEOUT', 'DROP_DUPLICATE'], outer_class=root_module['ns3::Ipv4L3Protocol'], import_from_module='ns.internet')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )', 'ns3::Ipv4L3Protocol::SentTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )*', 'ns3::Ipv4L3Protocol::SentTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, uint32_t )&', 'ns3::Ipv4L3Protocol::SentTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv4 >, uint32_t )', 'ns3::Ipv4L3Protocol::TxRxTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv4 >, uint32_t )*', 'ns3::Ipv4L3Protocol::TxRxTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::Ptr< ns3::Ipv4 >, uint32_t )&', 'ns3::Ipv4L3Protocol::TxRxTracedCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, uint32_t )', 'ns3::Ipv4L3Protocol::DropTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, uint32_t )*', 'ns3::Ipv4L3Protocol::DropTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, uint32_t )&', 'ns3::Ipv4L3Protocol::DropTracedCallback&')
     ## ipv4-address.h (module 'network'): ns3::Ipv4MaskChecker [class]
     module.add_class('Ipv4MaskChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## ipv4-address.h (module 'network'): ns3::Ipv4MaskValue [class]
@@ -312,14 +343,51 @@
     typehandlers.add_type_alias('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 >', 'ns3::Ipv4RoutingProtocol::ErrorCallback')
     typehandlers.add_type_alias('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 >*', 'ns3::Ipv4RoutingProtocol::ErrorCallback*')
     typehandlers.add_type_alias('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 >&', 'ns3::Ipv4RoutingProtocol::ErrorCallback&')
+    ## 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-interface.h (module 'internet'): ns3::Ipv6Interface [class]
+    module.add_class('Ipv6Interface', import_from_module='ns.internet', parent=root_module['ns3::Object'])
+    ## 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-route.h (module 'internet'): ns3::Ipv6MulticastRoute [class]
+    module.add_class('Ipv6MulticastRoute', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >'])
+    ## 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]
     module.add_class('Ipv6PrefixValue', import_from_module='ns.network', parent=root_module['ns3::AttributeValue'])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Route [class]
+    module.add_class('Ipv6Route', import_from_module='ns.internet', parent=root_module['ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >'])
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ipv6RoutingProtocol [class]
+    module.add_class('Ipv6RoutingProtocol', import_from_module='ns.internet', parent=root_module['ns3::Object'])
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::UnicastForwardCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::UnicastForwardCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::UnicastForwardCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::MulticastForwardCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::MulticastForwardCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::MulticastForwardCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::LocalDeliverCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::LocalDeliverCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::LocalDeliverCallback&')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ns3::Ipv6RoutingProtocol::ErrorCallback')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >*', 'ns3::Ipv6RoutingProtocol::ErrorCallback*')
+    typehandlers.add_type_alias('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >&', 'ns3::Ipv6RoutingProtocol::ErrorCallback&')
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker [class]
     module.add_class('Mac48AddressChecker', import_from_module='ns.network', parent=root_module['ns3::AttributeChecker'])
     ## mac48-address.h (module 'network'): ns3::Mac48AddressValue [class]
@@ -391,6 +459,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<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<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, 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::Ipv4>, 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::Ipv4>', '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]
@@ -403,17 +483,23 @@
     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'])
     ## ipv4-list-routing.h (module 'internet'): ns3::Ipv4ListRouting [class]
     module.add_class('Ipv4ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv4RoutingProtocol'])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorRouting [class]
-    module.add_class('Ipv4NixVectorRouting', parent=root_module['ns3::Ipv4RoutingProtocol'])
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting [class]
+    module.add_class('Ipv6ListRouting', import_from_module='ns.internet', parent=root_module['ns3::Ipv6RoutingProtocol'])
     module.add_container('std::map< std::string, ns3::LogComponent * >', ('std::string', 'ns3::LogComponent *'), container_type='map')
     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('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::NixVector > >', 'ns3::NixMap_t')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::NixVector > >*', 'ns3::NixMap_t*')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::NixVector > >&', 'ns3::NixMap_t&')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::Ipv4Route > >', 'ns3::Ipv4RouteMap_t')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::Ipv4Route > >*', 'ns3::Ipv4RouteMap_t*')
-    typehandlers.add_type_alias('std::map< ns3::Ipv4Address, ns3::Ptr< ns3::Ipv4Route > >&', 'ns3::Ipv4RouteMap_t&')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >', 'ns3::Ipv4NixVectorRouting')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >*', 'ns3::Ipv4NixVectorRouting*')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv4RoutingProtocol >&', 'ns3::Ipv4NixVectorRouting&')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv6RoutingProtocol >', 'ns3::Ipv6NixVectorRouting')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv6RoutingProtocol >*', 'ns3::Ipv6NixVectorRouting*')
+    typehandlers.add_type_alias('ns3::NixVectorRouting< ns3::Ipv6RoutingProtocol >&', 'ns3::Ipv6NixVectorRouting&')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv4RoutingHelper >', 'ns3::Ipv4NixVectorHelper')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv4RoutingHelper >*', 'ns3::Ipv4NixVectorHelper*')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv4RoutingHelper >&', 'ns3::Ipv4NixVectorHelper&')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv6RoutingHelper >', 'ns3::Ipv6NixVectorHelper')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv6RoutingHelper >*', 'ns3::Ipv6NixVectorHelper*')
+    typehandlers.add_type_alias('ns3::NixVectorHelper< ns3::Ipv6RoutingHelper >&', 'ns3::Ipv6NixVectorHelper&')
     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&')
@@ -498,7 +584,6 @@
     register_Ns3DefaultDeleter__Ns3CallbackImplBase_methods(root_module, root_module['ns3::DefaultDeleter< ns3::CallbackImplBase >'])
     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__Ns3Ipv4Route_methods(root_module, root_module['ns3::DefaultDeleter< ns3::Ipv4Route >'])
     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__Ns3TraceSourceAccessor_methods(root_module, root_module['ns3::DefaultDeleter< ns3::TraceSourceAccessor >'])
@@ -513,7 +598,9 @@
     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_Ns3Ipv6InterfaceAddress_methods(root_module, root_module['ns3::Ipv6InterfaceAddress'])
     register_Ns3Ipv6Prefix_methods(root_module, root_module['ns3::Ipv6Prefix'])
+    register_Ns3Ipv6RoutingHelper_methods(root_module, root_module['ns3::Ipv6RoutingHelper'])
     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'])
@@ -545,7 +632,7 @@
     register_Ns3Chunk_methods(root_module, root_module['ns3::Chunk'])
     register_Ns3Header_methods(root_module, root_module['ns3::Header'])
     register_Ns3Ipv4Header_methods(root_module, root_module['ns3::Ipv4Header'])
-    register_Ns3Ipv4NixVectorHelper_methods(root_module, root_module['ns3::Ipv4NixVectorHelper'])
+    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_Ns3SimpleRefCount__Ns3AttributeAccessor_Ns3Empty_Ns3DefaultDeleter__lt__ns3AttributeAccessor__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::AttributeAccessor, ns3::empty, ns3::DefaultDeleter<ns3::AttributeAccessor> >'])
@@ -556,6 +643,8 @@
     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__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >'])
+    register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, root_module['ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >'])
     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> >'])
@@ -583,15 +672,24 @@
     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'])
+    register_Ns3Ipv4Interface_methods(root_module, root_module['ns3::Ipv4Interface'])
+    register_Ns3Ipv4L3Protocol_methods(root_module, root_module['ns3::Ipv4L3Protocol'])
     register_Ns3Ipv4MaskChecker_methods(root_module, root_module['ns3::Ipv4MaskChecker'])
     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_Ns3Ipv4RoutingProtocol_methods(root_module, root_module['ns3::Ipv4RoutingProtocol'])
+    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_Ns3Ipv6Interface_methods(root_module, root_module['ns3::Ipv6Interface'])
+    register_Ns3Ipv6L3Protocol_methods(root_module, root_module['ns3::Ipv6L3Protocol'])
+    register_Ns3Ipv6MulticastRoute_methods(root_module, root_module['ns3::Ipv6MulticastRoute'])
+    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_Ns3Ipv6Route_methods(root_module, root_module['ns3::Ipv6Route'])
+    register_Ns3Ipv6RoutingProtocol_methods(root_module, root_module['ns3::Ipv6RoutingProtocol'])
     register_Ns3Mac48AddressChecker_methods(root_module, root_module['ns3::Mac48AddressChecker'])
     register_Ns3Mac48AddressValue_methods(root_module, root_module['ns3::Mac48AddressValue'])
     register_Ns3NetDevice_methods(root_module, root_module['ns3::NetDevice'])
@@ -610,13 +708,19 @@
     register_Ns3BridgeNetDevice_methods(root_module, root_module['ns3::BridgeNetDevice'])
     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_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_Ns3Ptr__lt__const_ns3Packet__gt___Ns3Ptr__lt__ns3Ipv4__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::Ipv4>, 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 >'])
     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_Ns3Ipv4ListRouting_methods(root_module, root_module['ns3::Ipv4ListRouting'])
-    register_Ns3Ipv4NixVectorRouting_methods(root_module, root_module['ns3::Ipv4NixVectorRouting'])
+    register_Ns3Ipv6ListRouting_methods(root_module, root_module['ns3::Ipv6ListRouting'])
     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'])
@@ -1185,18 +1289,6 @@
                    is_static=True)
     return
 
-def register_Ns3DefaultDeleter__Ns3Ipv4Route_methods(root_module, cls):
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Ipv4Route>::DefaultDeleter() [constructor]
-    cls.add_constructor([])
-    ## default-deleter.h (module 'core'): ns3::DefaultDeleter<ns3::Ipv4Route>::DefaultDeleter(ns3::DefaultDeleter<ns3::Ipv4Route> const & arg0) [constructor]
-    cls.add_constructor([param('ns3::DefaultDeleter< ns3::Ipv4Route > const &', 'arg0')])
-    ## default-deleter.h (module 'core'): static void ns3::DefaultDeleter<ns3::Ipv4Route>::Delete(ns3::Ipv4Route * object) [member function]
-    cls.add_method('Delete', 
-                   'void', 
-                   [param('ns3::Ipv4Route *', '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([])
@@ -1475,11 +1567,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1552,6 +1639,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1572,11 +1664,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1645,11 +1746,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1823,11 +1919,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1965,6 +2056,77 @@
                    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('==')
@@ -2020,11 +2182,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -2041,6 +2198,63 @@
                    [param('uint8_t', 'prefixLength')])
     return
 
+def register_Ns3Ipv6RoutingHelper_methods(root_module, cls):
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper::Ipv6RoutingHelper() [constructor]
+    cls.add_constructor([])
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper::Ipv6RoutingHelper(ns3::Ipv6RoutingHelper const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6RoutingHelper const &', 'arg0')])
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ipv6RoutingHelper * ns3::Ipv6RoutingHelper::Copy() const [member function]
+    cls.add_method('Copy', 
+                   'ns3::Ipv6RoutingHelper *', 
+                   [], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-helper.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6RoutingHelper::Create(ns3::Ptr<ns3::Node> node) const [member function]
+    cls.add_method('Create', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+                   is_const=True, is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheAllAt(ns3::Time printTime, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheAllAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheAllEvery(ns3::Time printInterval, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheAllEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheAt(ns3::Time printTime, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintNeighborCacheEvery(ns3::Time printInterval, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintNeighborCacheEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableAllAt(ns3::Time printTime, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableAllAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableAllEvery(ns3::Time printInterval, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableAllEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableAt(ns3::Time printTime, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableAt', 
+                   'void', 
+                   [param('ns3::Time', 'printTime'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    ## ipv6-routing-helper.h (module 'internet'): static void ns3::Ipv6RoutingHelper::PrintRoutingTableEvery(ns3::Time printInterval, ns3::Ptr<ns3::Node> node, ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) [member function]
+    cls.add_method('PrintRoutingTableEvery', 
+                   'void', 
+                   [param('ns3::Time', 'printInterval'), param('ns3::Ptr< ns3::Node >', 'node'), param('ns3::Ptr< ns3::OutputStreamWrapper >', 'stream'), param('ns3::Time::Unit', 'unit', default_value='::ns3::Time::Unit::S')], 
+                   is_static=True)
+    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')])
@@ -2431,6 +2645,8 @@
     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 const & typeId) [constructor]
+    cls.add_constructor([param('std::string const &', 'typeId')])
     ## object-factory.h (module 'core'): ns3::Ptr<ns3::Object> ns3::ObjectFactory::Create() const [member function]
     cls.add_method('Create', 
                    'ns3::Ptr< ns3::Object >', 
@@ -3608,25 +3824,152 @@
                    [param('uint8_t', 'ttl')])
     return
 
-def register_Ns3Ipv4NixVectorHelper_methods(root_module, cls):
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorHelper::Ipv4NixVectorHelper() [constructor]
+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([])
-    ## 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 *', 
+    ## 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::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestinationAddress() const [member function]
+    cls.add_method('GetDestinationAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   deprecated=True, 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)
-    ## ipv4-nix-vector-helper.h (module 'nix-vector-routing'): ns3::Ptr<ns3::Ipv4RoutingProtocol> ns3::Ipv4NixVectorHelper::Create(ns3::Ptr<ns3::Node> node) const [member function]
-    cls.add_method('Create', 
-                   'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')], 
+    ## 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::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
+    cls.add_method('GetSourceAddress', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   deprecated=True, 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)
-    ## 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', 
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestinationAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
+    ## 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('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')])
+                   [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSourceAddress', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
+    ## 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):
@@ -3766,6 +4109,20 @@
     cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv4Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv4Route > > const &', 'o')])
     return
 
+def register_Ns3SimpleRefCount__Ns3Ipv6MulticastRoute_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6MulticastRoute__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6MulticastRoute> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6MulticastRoute, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6MulticastRoute > > const &', 'o')])
+    return
+
+def register_Ns3SimpleRefCount__Ns3Ipv6Route_Ns3Empty_Ns3DefaultDeleter__lt__ns3Ipv6Route__gt___methods(root_module, cls):
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount() [constructor]
+    cls.add_constructor([])
+    ## simple-ref-count.h (module 'core'): ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> >::SimpleRefCount(ns3::SimpleRefCount<ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter<ns3::Ipv6Route> > const & o) [constructor]
+    cls.add_constructor([param('ns3::SimpleRefCount< ns3::Ipv6Route, ns3::empty, ns3::DefaultDeleter< ns3::Ipv6Route > > 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([])
@@ -4667,6 +5024,36 @@
                    '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::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')
     return
 
 def register_Ns3CallbackValue_methods(root_module, cls):
@@ -5078,42 +5465,379 @@
                    [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]
+def register_Ns3Ipv4Interface_methods(root_module, cls):
+    ## ipv4-interface.h (module 'internet'): static ns3::TypeId ns3::Ipv4Interface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4Interface::Ipv4Interface() [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 >', 
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetTrafficControl(ns3::Ptr<ns3::TrafficControlLayer> tc) [member function]
+    cls.add_method('SetTrafficControl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TrafficControlLayer >', 'tc')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetArpCache(ns3::Ptr<ns3::ArpCache> arpCache) [member function]
+    cls.add_method('SetArpCache', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::ArpCache >', 'arpCache')])
+    ## ipv4-interface.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4Interface::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
                    [], 
-                   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', 
-                   '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)
+    ## ipv4-interface.h (module 'internet'): ns3::Ptr<ns3::ArpCache> ns3::Ipv4Interface::GetArpCache() const [member function]
+    cls.add_method('GetArpCache', 
+                   'ns3::Ptr< ns3::ArpCache >', 
                    [], 
                    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', 
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetMetric(uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint16_t', 'metric')])
+    ## ipv4-interface.h (module 'internet'): uint16_t ns3::Ipv4Interface::GetMetric() const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::IsUp() const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::IsDown() const [member function]
+    cls.add_method('IsDown', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetUp() [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetDown() [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [])
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::IsForwarding() const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::SetForwarding(bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('bool', 'val')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::Send(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & hdr, ns3::Ipv4Address dest) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv4Header const &', 'hdr'), param('ns3::Ipv4Address', 'dest')])
+    ## ipv4-interface.h (module 'internet'): bool ns3::Ipv4Interface::AddAddress(ns3::Ipv4InterfaceAddress address) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('ns3::Ipv4InterfaceAddress', 'address')])
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4Interface::GetAddress(uint32_t index) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): uint32_t ns3::Ipv4Interface::GetNAddresses() const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4Interface::RemoveAddress(uint32_t index) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('uint32_t', 'index')])
+    ## ipv4-interface.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4Interface::RemoveAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('ns3::Ipv4Address', 'address')])
+    ## ipv4-interface.h (module 'internet'): void ns3::Ipv4Interface::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    return
+
+def register_Ns3Ipv4L3Protocol_methods(root_module, cls):
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol::Ipv4L3Protocol() [constructor]
+    cls.add_constructor([])
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::AddAddress(uint32_t i, ns3::Ipv4InterfaceAddress address) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('uint32_t', 'i'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv4L3Protocol::AddInterface(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('AddInterface', 
+                   'uint32_t', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Socket> ns3::Ipv4L3Protocol::CreateRawSocket() [member function]
+    cls.add_method('CreateRawSocket', 
+                   'ns3::Ptr< ns3::Socket >', 
+                   [], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::DeleteRawSocket(ns3::Ptr<ns3::Socket> socket) [member function]
+    cls.add_method('DeleteRawSocket', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Socket >', 'socket')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4InterfaceAddress ns3::Ipv4L3Protocol::GetAddress(uint32_t interfaceIndex, uint32_t addressIndex) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4InterfaceAddress', 
+                   [param('uint32_t', 'interfaceIndex'), param('uint32_t', 'addressIndex')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv4Interface> ns3::Ipv4L3Protocol::GetInterface(uint32_t i) const [member function]
+    cls.add_method('GetInterface', 
+                   'ns3::Ptr< ns3::Ipv4Interface >', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True)
+    ## ipv4-l3-protocol.h (module 'internet'): int32_t ns3::Ipv4L3Protocol::GetInterfaceForAddress(ns3::Ipv4Address addr) const [member function]
+    cls.add_method('GetInterfaceForAddress', 
+                   'int32_t', 
+                   [param('ns3::Ipv4Address', 'addr')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): int32_t ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): int32_t ns3::Ipv4L3Protocol::GetInterfaceForPrefix(ns3::Ipv4Address addr, ns3::Ipv4Mask mask) const [member function]
+    cls.add_method('GetInterfaceForPrefix', 
+                   'int32_t', 
+                   [param('ns3::Ipv4Address', 'addr'), param('ns3::Ipv4Mask', 'mask')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv4L3Protocol::GetMetric(uint32_t i) const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint16_t ns3::Ipv4L3Protocol::GetMtu(uint32_t i) const [member function]
+    cls.add_method('GetMtu', 
+                   'uint16_t', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv4L3Protocol::GetNAddresses(uint32_t interface) const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [param('uint32_t', 'interface')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): uint32_t ns3::Ipv4L3Protocol::GetNInterfaces() const [member function]
+    cls.add_method('GetNInterfaces', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4L3Protocol::GetNetDevice(uint32_t i) [member function]
+    cls.add_method('GetNetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4L3Protocol::GetProtocol(int protocolNumber) const [member function]
+    cls.add_method('GetProtocol', 
+                   'ns3::Ptr< ns3::IpL4Protocol >', 
+                   [param('int', 'protocolNumber')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::IpL4Protocol> ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv4RoutingProtocol> ns3::Ipv4L3Protocol::GetRoutingProtocol() const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv4RoutingProtocol >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv4L3Protocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::Insert(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Insert', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsForwarding(uint32_t i) const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUnicast(ns3::Ipv4Address ad) const [member function]
+    cls.add_method('IsUnicast', 
+                   'bool', 
+                   [param('ns3::Ipv4Address', 'ad')], 
+                   is_const=True)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::IsUp(uint32_t i) const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [param('uint32_t', 'i')], 
+                   is_const=True, is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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')])
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::Remove(ns3::Ptr<ns3::IpL4Protocol> protocol) [member function]
+    cls.add_method('Remove', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::IpL4Protocol >', 'protocol')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetDefaultTtl(uint8_t ttl) [member function]
+    cls.add_method('SetDefaultTtl', 
+                   'void', 
+                   [param('uint8_t', 'ttl')])
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetDown(uint32_t i) [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetForwarding(uint32_t i, bool val) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('uint32_t', 'i'), param('bool', 'val')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetRoutingProtocol(ns3::Ptr<ns3::Ipv4RoutingProtocol> routingProtocol) [member function]
+    cls.add_method('SetRoutingProtocol', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Ipv4RoutingProtocol >', 'routingProtocol')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetUp(uint32_t i) [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [param('uint32_t', 'i')], 
+                   is_virtual=True)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4L3Protocol::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)
+    ## ipv4-l3-protocol.h (module 'internet'): ns3::Ipv4L3Protocol::PROT_NUMBER [variable]
+    cls.add_static_attribute('PROT_NUMBER', 'uint16_t const', is_const=True)
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::NotifyNewAggregate() [member function]
+    cls.add_method('NotifyNewAggregate', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::GetIpForward() const [member function]
+    cls.add_method('GetIpForward', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv4-l3-protocol.h (module 'internet'): bool ns3::Ipv4L3Protocol::GetWeakEsModel() const [member function]
+    cls.add_method('GetWeakEsModel', 
+                   'bool', 
+                   [], 
+                   is_const=True, is_virtual=True, visibility='private')
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetIpForward(bool forward) [member function]
+    cls.add_method('SetIpForward', 
+                   'void', 
+                   [param('bool', 'forward')], 
+                   is_virtual=True, visibility='private')
+    ## ipv4-l3-protocol.h (module 'internet'): void ns3::Ipv4L3Protocol::SetWeakEsModel(bool model) [member function]
+    cls.add_method('SetWeakEsModel', 
+                   'void', 
+                   [param('bool', 'model')], 
+                   is_virtual=True, visibility='private')
+    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 >', 
+                   [], 
+                   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', 
+                   '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)
+    ## 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', 
                    'void', 
                    [param('ns3::Ipv4Mask const &', 'value')])
     return
@@ -5171,176 +5895,1004 @@
     cls.add_constructor([param('ns3::Ipv4Route const &', 'arg0')])
     ## ipv4-route.h (module 'internet'): ns3::Ipv4Route::Ipv4Route() [constructor]
     cls.add_constructor([])
-    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetDestination() const [member function]
+    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetGateway() const [member function]
+    cls.add_method('GetGateway', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4Route::GetOutputDevice() const [member function]
+    cls.add_method('GetOutputDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetDestination(ns3::Ipv4Address dest) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'dest')])
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetGateway(ns3::Ipv4Address gw) [member function]
+    cls.add_method('SetGateway', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'gw')])
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetOutputDevice(ns3::Ptr<ns3::NetDevice> outputDevice) [member function]
+    cls.add_method('SetOutputDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'outputDevice')])
+    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetSource(ns3::Ipv4Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'src')])
+    return
+
+def register_Ns3Ipv4RoutingProtocol_methods(root_module, cls):
+    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol() [constructor]
+    cls.add_constructor([])
+    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol(ns3::Ipv4RoutingProtocol const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv4RoutingProtocol const &', 'arg0')])
+    ## ipv4-routing-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv4RoutingProtocol::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+    cls.add_method('NotifyAddAddress', 
+                   'void', 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   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_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_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_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_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_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_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_pure_virtual=True, is_virtual=True)
+    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([])
+    ## 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)
+    ## 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('ns3::Ipv6Address const &', 'value')])
+    return
+
+def register_Ns3Ipv6Interface_methods(root_module, cls):
+    ## ipv6-interface.h (module 'internet'): static ns3::TypeId ns3::Ipv6Interface::GetTypeId() [member function]
+    cls.add_method('GetTypeId', 
+                   'ns3::TypeId', 
+                   [], 
+                   is_static=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6Interface::Ipv6Interface() [constructor]
+    cls.add_constructor([])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetNode(ns3::Ptr<ns3::Node> node) [member function]
+    cls.add_method('SetNode', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Node >', 'node')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetDevice(ns3::Ptr<ns3::NetDevice> device) [member function]
+    cls.add_method('SetDevice', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::NetDevice >', 'device')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetTrafficControl(ns3::Ptr<ns3::TrafficControlLayer> tc) [member function]
+    cls.add_method('SetTrafficControl', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::TrafficControlLayer >', 'tc')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6Interface::GetDevice() const [member function]
+    cls.add_method('GetDevice', 
+                   'ns3::Ptr< ns3::NetDevice >', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetMetric(uint16_t metric) [member function]
+    cls.add_method('SetMetric', 
+                   'void', 
+                   [param('uint16_t', 'metric')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetMetric() const [member function]
+    cls.add_method('GetMetric', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsUp() const [member function]
+    cls.add_method('IsUp', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsDown() const [member function]
+    cls.add_method('IsDown', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetUp() [member function]
+    cls.add_method('SetUp', 
+                   'void', 
+                   [])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetDown() [member function]
+    cls.add_method('SetDown', 
+                   'void', 
+                   [])
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsForwarding() const [member function]
+    cls.add_method('IsForwarding', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetForwarding(bool forward) [member function]
+    cls.add_method('SetForwarding', 
+                   'void', 
+                   [param('bool', 'forward')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetCurHopLimit(uint8_t curHopLimit) [member function]
+    cls.add_method('SetCurHopLimit', 
+                   'void', 
+                   [param('uint8_t', 'curHopLimit')])
+    ## ipv6-interface.h (module 'internet'): uint8_t ns3::Ipv6Interface::GetCurHopLimit() const [member function]
+    cls.add_method('GetCurHopLimit', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetBaseReachableTime(uint16_t baseReachableTime) [member function]
+    cls.add_method('SetBaseReachableTime', 
+                   'void', 
+                   [param('uint16_t', 'baseReachableTime')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetBaseReachableTime() const [member function]
+    cls.add_method('GetBaseReachableTime', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetReachableTime(uint16_t reachableTime) [member function]
+    cls.add_method('SetReachableTime', 
+                   'void', 
+                   [param('uint16_t', 'reachableTime')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetReachableTime() const [member function]
+    cls.add_method('GetReachableTime', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetRetransTimer(uint16_t retransTimer) [member function]
+    cls.add_method('SetRetransTimer', 
+                   'void', 
+                   [param('uint16_t', 'retransTimer')])
+    ## ipv6-interface.h (module 'internet'): uint16_t ns3::Ipv6Interface::GetRetransTimer() const [member function]
+    cls.add_method('GetRetransTimer', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::Send(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header const & hdr, ns3::Ipv6Address dest) [member function]
+    cls.add_method('Send', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'hdr'), param('ns3::Ipv6Address', 'dest')])
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::AddAddress(ns3::Ipv6InterfaceAddress iface) [member function]
+    cls.add_method('AddAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6InterfaceAddress', 'iface')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::GetLinkLocalAddress() const [member function]
+    cls.add_method('GetLinkLocalAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): bool ns3::Ipv6Interface::IsSolicitedMulticastAddress(ns3::Ipv6Address address) const [member function]
+    cls.add_method('IsSolicitedMulticastAddress', 
+                   'bool', 
+                   [param('ns3::Ipv6Address', 'address')], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::GetAddress(uint32_t index) const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'index')], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::GetAddressMatchingDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('GetAddressMatchingDestination', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('ns3::Ipv6Address', 'dst')])
+    ## ipv6-interface.h (module 'internet'): uint32_t ns3::Ipv6Interface::GetNAddresses() const [member function]
+    cls.add_method('GetNAddresses', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::RemoveAddress(uint32_t index) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('uint32_t', 'index')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ipv6InterfaceAddress ns3::Ipv6Interface::RemoveAddress(ns3::Ipv6Address address) [member function]
+    cls.add_method('RemoveAddress', 
+                   'ns3::Ipv6InterfaceAddress', 
+                   [param('ns3::Ipv6Address', 'address')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetState(ns3::Ipv6Address address, ns3::Ipv6InterfaceAddress::State_e state) [member function]
+    cls.add_method('SetState', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('ns3::Ipv6InterfaceAddress::State_e', 'state')])
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::SetNsDadUid(ns3::Ipv6Address address, uint32_t uid) [member function]
+    cls.add_method('SetNsDadUid', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'address'), param('uint32_t', 'uid')])
+    ## ipv6-interface.h (module 'internet'): ns3::Ptr<ns3::NdiscCache> ns3::Ipv6Interface::GetNdiscCache() const [member function]
+    cls.add_method('GetNdiscCache', 
+                   'ns3::Ptr< ns3::NdiscCache >', 
+                   [], 
+                   is_const=True)
+    ## ipv6-interface.h (module 'internet'): void ns3::Ipv6Interface::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
+    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_Ns3Ipv6MulticastRoute_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::Ipv6MulticastRoute(ns3::Ipv6MulticastRoute const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6MulticastRoute const &', 'arg0')])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::Ipv6MulticastRoute() [constructor]
+    cls.add_constructor([])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6MulticastRoute::GetGroup() const [member function]
+    cls.add_method('GetGroup', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6MulticastRoute::GetOrigin() const [member function]
+    cls.add_method('GetOrigin', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): std::map<unsigned int, unsigned int, std::less<unsigned int>, std::allocator<std::pair<const unsigned int, unsigned int> > > ns3::Ipv6MulticastRoute::GetOutputTtlMap() const [member function]
+    cls.add_method('GetOutputTtlMap', 
+                   'std::map< unsigned int, unsigned int >', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): uint32_t ns3::Ipv6MulticastRoute::GetParent() const [member function]
+    cls.add_method('GetParent', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True)
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetGroup(ns3::Ipv6Address const group) [member function]
+    cls.add_method('SetGroup', 
+                   'void', 
+                   [param('ns3::Ipv6Address const', 'group')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetOrigin(ns3::Ipv6Address const origin) [member function]
+    cls.add_method('SetOrigin', 
+                   'void', 
+                   [param('ns3::Ipv6Address const', 'origin')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetOutputTtl(uint32_t oif, uint32_t ttl) [member function]
+    cls.add_method('SetOutputTtl', 
+                   'void', 
+                   [param('uint32_t', 'oif'), param('uint32_t', 'ttl')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6MulticastRoute::SetParent(uint32_t iif) [member function]
+    cls.add_method('SetParent', 
+                   'void', 
+                   [param('uint32_t', 'iif')])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::MAX_INTERFACES [variable]
+    cls.add_static_attribute('MAX_INTERFACES', 'uint32_t const', is_const=True)
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6MulticastRoute::MAX_TTL [variable]
+    cls.add_static_attribute('MAX_TTL', 'uint32_t const', is_const=True)
+    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([])
+    ## 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)
+    ## 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)
+    ## 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_Ns3Ipv6Route_methods(root_module, cls):
+    cls.add_output_stream_operator()
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Route::Ipv6Route(ns3::Ipv6Route const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6Route const &', 'arg0')])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Route::Ipv6Route() [constructor]
+    cls.add_constructor([])
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Route::GetDestination() const [member function]
     cls.add_method('GetDestination', 
-                   'ns3::Ipv4Address', 
+                   'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetGateway() const [member function]
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Route::GetGateway() const [member function]
     cls.add_method('GetGateway', 
-                   'ns3::Ipv4Address', 
+                   'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv4Route::GetOutputDevice() const [member function]
+    ## ipv6-route.h (module 'internet'): ns3::Ptr<ns3::NetDevice> ns3::Ipv6Route::GetOutputDevice() const [member function]
     cls.add_method('GetOutputDevice', 
                    'ns3::Ptr< ns3::NetDevice >', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4Route::GetSource() const [member function]
+    ## ipv6-route.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Route::GetSource() const [member function]
     cls.add_method('GetSource', 
-                   'ns3::Ipv4Address', 
+                   'ns3::Ipv6Address', 
                    [], 
                    is_const=True)
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetDestination(ns3::Ipv4Address dest) [member function]
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetDestination(ns3::Ipv6Address dest) [member function]
     cls.add_method('SetDestination', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'dest')])
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetGateway(ns3::Ipv4Address gw) [member function]
+                   [param('ns3::Ipv6Address', 'dest')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetGateway(ns3::Ipv6Address gw) [member function]
     cls.add_method('SetGateway', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'gw')])
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetOutputDevice(ns3::Ptr<ns3::NetDevice> outputDevice) [member function]
+                   [param('ns3::Ipv6Address', 'gw')])
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetOutputDevice(ns3::Ptr<ns3::NetDevice> outputDevice) [member function]
     cls.add_method('SetOutputDevice', 
                    'void', 
                    [param('ns3::Ptr< ns3::NetDevice >', 'outputDevice')])
-    ## ipv4-route.h (module 'internet'): void ns3::Ipv4Route::SetSource(ns3::Ipv4Address src) [member function]
+    ## ipv6-route.h (module 'internet'): void ns3::Ipv6Route::SetSource(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSource', 
                    'void', 
-                   [param('ns3::Ipv4Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')])
     return
 
-def register_Ns3Ipv4RoutingProtocol_methods(root_module, cls):
-    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol() [constructor]
+def register_Ns3Ipv6RoutingProtocol_methods(root_module, cls):
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ipv6RoutingProtocol::Ipv6RoutingProtocol() [constructor]
     cls.add_constructor([])
-    ## ipv4-routing-protocol.h (module 'internet'): ns3::Ipv4RoutingProtocol::Ipv4RoutingProtocol(ns3::Ipv4RoutingProtocol const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4RoutingProtocol const &', 'arg0')])
-    ## ipv4-routing-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv4RoutingProtocol::GetTypeId() [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ipv6RoutingProtocol::Ipv6RoutingProtocol(ns3::Ipv6RoutingProtocol const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6RoutingProtocol const &', 'arg0')])
+    ## ipv6-routing-protocol.h (module 'internet'): static ns3::TypeId ns3::Ipv6RoutingProtocol::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyAddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyAddAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyAddRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyAddRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyInterfaceDown(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
                    is_pure_virtual=True, is_virtual=True)
-    ## ipv4-routing-protocol.h (module 'internet'): void ns3::Ipv4RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyInterfaceUp(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
                    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]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyRemoveAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyRemoveAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
                    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]
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::NotifyRemoveRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyRemoveRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_pure_virtual=True, is_virtual=True)
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::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_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]
+    ## ipv6-routing-protocol.h (module 'internet'): bool ns3::Ipv6RoutingProtocol::RouteInput(ns3::Ptr<const ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<const ns3::NetDevice> idev, ns3::Ipv6RoutingProtocol::UnicastForwardCallback ucb, ns3::Ipv6RoutingProtocol::MulticastForwardCallback mcb, ns3::Ipv6RoutingProtocol::LocalDeliverCallback lcb, ns3::Ipv6RoutingProtocol::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')], 
+                   [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header 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::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], 
                    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]
+    ## ipv6-routing-protocol.h (module 'internet'): ns3::Ptr<ns3::Ipv6Route> ns3::Ipv6RoutingProtocol::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header 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')], 
+                   'ns3::Ptr< ns3::Ipv6Route >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
                    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', 
+    ## ipv6-routing-protocol.h (module 'internet'): void ns3::Ipv6RoutingProtocol::SetIpv6(ns3::Ptr<ns3::Ipv6> ipv6) [member function]
+    cls.add_method('SetIpv6', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], 
+                   [param('ns3::Ptr< ns3::Ipv6 >', 'ipv6')], 
                    is_pure_virtual=True, is_virtual=True)
     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)
-    ## 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('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')])
-    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)
-    ## 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)
-    ## 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_Ns3Mac48AddressChecker_methods(root_module, cls):
     ## mac48-address.h (module 'network'): ns3::Mac48AddressChecker::Mac48AddressChecker() [constructor]
     cls.add_constructor([])
@@ -6252,6 +7804,138 @@
                    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([])
+    ## 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(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> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv4Header const &, ns3::Ptr< ns3::Packet const >, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr< ns3::Ipv4 >, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty > const &', 'arg0')])
+    ## callback.h (module 'core'): static std::string 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>::DoGetTypeid() [member function]
+    cls.add_method('DoGetTypeid', 
+                   'std::string', 
+                   [], 
+                   is_static=True)
+    ## callback.h (module 'core'): std::string 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>::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::Ipv4Header &, ns3::Ptr<const ns3::Packet>, ns3::Ipv4L3Protocol::DropReason, ns3::Ptr<ns3::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv4Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, ns3::Ipv4L3Protocol::DropReason arg2, ns3::Ptr<ns3::Ipv4> arg3, unsigned int arg4) [member operator]
+    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_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):
+    ## 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>::CallbackImpl() [constructor]
+    cls.add_constructor([])
+    ## 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>::CallbackImpl(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> const & arg0) [constructor]
+    cls.add_constructor([param('ns3::CallbackImpl< void, ns3::Ipv4Header 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::Ipv4Header &, 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::Ipv4Header &, 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::Ipv4Header &, ns3::Ptr<const ns3::Packet>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ipv4Header const & arg0, ns3::Ptr<const ns3::Packet> arg1, unsigned int arg2) [member operator]
+    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_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__ns3Ipv4__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::Ipv4>, 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::Ipv4>, 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::Ipv4>, 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::Ipv4 >, 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::Ipv4>, 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::Ipv4>, 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::Ipv4>, unsigned int, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty>::operator()(ns3::Ptr<const ns3::Packet> arg0, ns3::Ptr<ns3::Ipv4> arg1, unsigned int arg2) [member operator]
+    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_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([])
@@ -6439,75 +8123,86 @@
                    is_virtual=True, visibility='protected')
     return
 
-def register_Ns3Ipv4NixVectorRouting_methods(root_module, cls):
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorRouting::Ipv4NixVectorRouting(ns3::Ipv4NixVectorRouting const & arg0) [constructor]
-    cls.add_constructor([param('ns3::Ipv4NixVectorRouting const &', 'arg0')])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ipv4NixVectorRouting::Ipv4NixVectorRouting() [constructor]
+def register_Ns3Ipv6ListRouting_methods(root_module, cls):
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting::Ipv6ListRouting(ns3::Ipv6ListRouting const & arg0) [constructor]
+    cls.add_constructor([param('ns3::Ipv6ListRouting const &', 'arg0')])
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ipv6ListRouting::Ipv6ListRouting() [constructor]
     cls.add_constructor([])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::FlushGlobalNixRoutingCache() const [member function]
-    cls.add_method('FlushGlobalNixRoutingCache', 
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::AddRoutingProtocol(ns3::Ptr<ns3::Ipv6RoutingProtocol> routingProtocol, int16_t priority) [member function]
+    cls.add_method('AddRoutingProtocol', 
                    'void', 
+                   [param('ns3::Ptr< ns3::Ipv6RoutingProtocol >', 'routingProtocol'), param('int16_t', 'priority')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): uint32_t ns3::Ipv6ListRouting::GetNRoutingProtocols() const [member function]
+    cls.add_method('GetNRoutingProtocols', 
+                   'uint32_t', 
                    [], 
-                   is_const=True)
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): static ns3::TypeId ns3::Ipv4NixVectorRouting::GetTypeId() [member function]
+                   is_const=True, is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ptr<ns3::Ipv6RoutingProtocol> ns3::Ipv6ListRouting::GetRoutingProtocol(uint32_t index, int16_t & priority) const [member function]
+    cls.add_method('GetRoutingProtocol', 
+                   'ns3::Ptr< ns3::Ipv6RoutingProtocol >', 
+                   [param('uint32_t', 'index'), param('int16_t &', 'priority')], 
+                   is_const=True, is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): static ns3::TypeId ns3::Ipv6ListRouting::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    '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', 
-                   [param('ns3::Ptr< ns3::Node >', 'node')])
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::DoDispose() [member function]
-    cls.add_method('DoDispose', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyAddAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyAddAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyAddAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyInterfaceDown(uint32_t interface) [member function]
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyAddRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyAddRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyInterfaceDown(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceDown', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyInterfaceUp(uint32_t interface) [member function]
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyInterfaceUp(uint32_t interface) [member function]
     cls.add_method('NotifyInterfaceUp', 
                    'void', 
                    [param('uint32_t', 'interface')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::NotifyRemoveAddress(uint32_t interface, ns3::Ipv4InterfaceAddress address) [member function]
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyRemoveAddress(uint32_t interface, ns3::Ipv6InterfaceAddress address) [member function]
     cls.add_method('NotifyRemoveAddress', 
                    'void', 
-                   [param('uint32_t', 'interface'), param('ns3::Ipv4InterfaceAddress', 'address')], 
-                   is_virtual=True, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::PrintRoutingTable(ns3::Ptr<ns3::OutputStreamWrapper> stream, ns3::Time::Unit unit=::ns3::Time::Unit::S) const [member function]
+                   [param('uint32_t', 'interface'), param('ns3::Ipv6InterfaceAddress', 'address')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::NotifyRemoveRoute(ns3::Ipv6Address dst, ns3::Ipv6Prefix mask, ns3::Ipv6Address nextHop, uint32_t interface, ns3::Ipv6Address prefixToUse=ns3::Ipv6Address::GetZero()) [member function]
+    cls.add_method('NotifyRemoveRoute', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst'), param('ns3::Ipv6Prefix', 'mask'), param('ns3::Ipv6Address', 'nextHop'), param('uint32_t', 'interface'), param('ns3::Ipv6Address', 'prefixToUse', default_value='ns3::Ipv6Address::GetZero()')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::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, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): bool ns3::Ipv4NixVectorRouting::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]
+                   is_const=True, is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): bool ns3::Ipv6ListRouting::RouteInput(ns3::Ptr<const ns3::Packet> p, ns3::Ipv6Header const & header, ns3::Ptr<const ns3::NetDevice> idev, ns3::Ipv6RoutingProtocol::UnicastForwardCallback ucb, ns3::Ipv6RoutingProtocol::MulticastForwardCallback mcb, ns3::Ipv6RoutingProtocol::LocalDeliverCallback lcb, ns3::Ipv6RoutingProtocol::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, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): ns3::Ptr<ns3::Ipv4Route> ns3::Ipv4NixVectorRouting::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv4Header const & header, ns3::Ptr<ns3::NetDevice> oif, ns3::Socket::SocketErrno & sockerr) [member function]
+                   [param('ns3::Ptr< ns3::Packet const >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice const >', 'idev'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6Route >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ucb'), param('ns3::Callback< void, ns3::Ptr< ns3::NetDevice const >, ns3::Ptr< ns3::Ipv6MulticastRoute >, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header const &, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'mcb'), param('ns3::Callback< void, ns3::Ptr< ns3::Packet const >, ns3::Ipv6Header 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::Ipv6Header const &, ns3::Socket::SocketErrno, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty, ns3::empty >', 'ecb')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): ns3::Ptr<ns3::Ipv6Route> ns3::Ipv6ListRouting::RouteOutput(ns3::Ptr<ns3::Packet> p, ns3::Ipv6Header 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, visibility='private')
-    ## ipv4-nix-vector-routing.h (module 'nix-vector-routing'): void ns3::Ipv4NixVectorRouting::SetIpv4(ns3::Ptr<ns3::Ipv4> ipv4) [member function]
-    cls.add_method('SetIpv4', 
+                   'ns3::Ptr< ns3::Ipv6Route >', 
+                   [param('ns3::Ptr< ns3::Packet >', 'p'), param('ns3::Ipv6Header const &', 'header'), param('ns3::Ptr< ns3::NetDevice >', 'oif'), param('ns3::Socket::SocketErrno &', 'sockerr')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::SetIpv6(ns3::Ptr<ns3::Ipv6> ipv6) [member function]
+    cls.add_method('SetIpv6', 
                    'void', 
-                   [param('ns3::Ptr< ns3::Ipv4 >', 'ipv4')], 
-                   is_virtual=True, visibility='private')
+                   [param('ns3::Ptr< ns3::Ipv6 >', 'ipv6')], 
+                   is_virtual=True)
+    ## ipv6-list-routing.h (module 'internet'): void ns3::Ipv6ListRouting::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3HashImplementation_methods(root_module, cls):
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/doc/nix-vector-routing.rst ns-3.35/src/nix-vector-routing/doc/nix-vector-routing.rst
--- ns-3.34/src/nix-vector-routing/doc/nix-vector-routing.rst	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/doc/nix-vector-routing.rst	2021-10-01 13:26:47.000000000 -0700
@@ -28,27 +28,51 @@
 known as a nix-vector.
 
 When a packet is generated at a node for transmission, the route is 
-calculated, and the nix-vector is built. 
+calculated, and the nix-vector is built.
+
+**How is the Nix-Vector calculated?**
 The nix-vector stores an index for each hop along the path, which 
-corresponds to the neighbor-index.  This index is used to determine 
-which net-device and gateway should be used.  To route a packet, the 
-nix-vector must be transmitted with the packet. At each hop, the 
-current node extracts the appropriate neighbor-index from the 
-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.
+corresponds to the neighbor-index.  This index is used to determine
+which net-device and gateway should be used.
+
+**How does the routing take place?**
+To route a packet, the nix-vector must be transmitted with the packet.
+At each hop, the current node extracts the appropriate neighbor-index
+from the nix-vector and transmits the packet through the corresponding
+net-device. This continues until the packet reaches the destination.
+
+.. note::
+   Nix-Vector routing does not use any routing metrics (interface metrics)
+   during the calculation of nix-vector. It is only based on the shortest
+   path calculated according to BFS.
+
+**How does Nix decide between two equally short path from source to
+destination?**
+It depends on how the topology is constructed i.e., the order in which the
+net-devices are added on a node and net-devices added on the channels
+associated with current node's net-devices. Please check the ``nix-simple.cc``
+example below to understand how nix-vectors are calculated.
+
+
+|ns3| supports IPv4 as well as IPv6 Nix-Vector routing.
 
 Scope and Limitations
 =====================
 
-Currently, the ns-3 model of nix-vector routing supports IPv4 p2p links 
-as well as CSMA links.  It does not (yet) provide support for 
-efficient adaptation to link failures.  It simply flushes all nix-vector 
-routing caches. Finally, IPv6 is not supported.
+Currently, the |ns3| model of nix-vector routing supports IPv4 and IPv6
+p2p links, CSMA links and multiple WiFi networks with the same channel object.
+It does not (yet) provide support for efficient adaptation to link failures.
+It simply flushes all nix-vector routing caches.
+
+NixVectorRouting performs a subnet matching check, but it does **not** check
+entirely if the addresses have been appropriately assigned. In other terms,
+using Nix-Vector routing, it is possible to have a working network that
+violates some good practices in IP address assignments.
+
+In case of IPv6, Nix assumes the link-local addresses assigned are **unique**.
+When using the IPv6 stack, the link-local address allocation is unique by
+default over the entire topology. However, if the link-local addresses are
+assigned manually, the user must ensure uniqueness of link-local addresses.
 
 
 Usage
@@ -57,8 +81,40 @@
 The usage pattern is the one of all the Internet routing protocols.
 Since NixVectorRouting is not installed by default in the 
 Internet stack, it is necessary to set it in the Internet Stack 
-helper by using ``InternetStackHelper::SetRoutingHelper``
+helper by using ``InternetStackHelper::SetRoutingHelper``.
+
+Remember to include the header file ``ns3/nix-vector-helper.h`` to
+use IPv4 or IPv6 Nix-Vector routing.
+
+.. note::
+   The previous header file ``ns3/ipv4-nix-vector-helper.h`` is
+   maintained for backward compatibility reasons. Therefore, the
+   existing IPv4 Nix-Vector routing simulations should work fine.
+
+*  Using IPv4 Nix-Vector Routing:
+
+.. code-block:: c++
+
+   Ipv4NixVectorHelper nixRouting;
+   InternetStackHelper stack;
+   stack.SetRoutingHelper (nixRouting);  // has effect on the next Install ()
+   stack.Install (allNodes);             // allNodes is the NodeContainer
+
+*  Using IPv6 Nix-Vector Routing:
+
+.. code-block:: c++
 
+   Ipv6NixVectorHelper nixRouting;
+   InternetStackHelper stack;
+   stack.SetRoutingHelper (nixRouting);  // has effect on the next Install ()
+   stack.Install (allNodes);             // allNodes is the NodeContainer
+
+.. note::
+   The NixVectorHelper helper class helps to use NixVectorRouting functionality.
+   The NixVectorRouting model can also be used directly to use Nix-Vector routing.
+   To use it directly, the header file ``ns3/nix-vector-routing.h`` should be
+   included. The previous header file ``ns3/ipv4-nix-vector-routing.h`` is maintained
+   for backwards compatibility with any existing IPv4 Nix-Vector routing simulations.
 
 Examples
 ========
@@ -66,3 +122,112 @@
 The examples for the NixVectorRouting module lives in
 the directory ``src/nix-vector-routing/examples``.
 
+There are examples which use both IPv4 and IPv6 networking.
+
+*  nix-simple.cc
+
+::
+
+  /*
+   *    ________
+   *   /        \
+   * 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
+   */
+
+In this topology, we install Nix-Vector routing between source
+n0 and destination n3. The shortest possible route will be
+n0 -> n2 -> n3.
+
+Let's see how the nix-vector will be generated for this path:
+
+n0 has 2 neighbors i.e. n1 and n3. n0 is connected to both using
+separate net-devices. But the net-device for n0 -- n1 p2p link was
+created before the netdevice for n0 -- n2 p2p link. Thus, n2 has
+neighbor-index of 1 (n1 has 0) with respect to n0.
+
+n2 has 3 neighbors i.e. n1, n3 and n0. The n2 net-device for n1 -- n2
+p2p link was created before the n2 net-device for n2 -- n3 p2p link
+which was before the n2 netdevice for n0 -- n2 p2p link. This, n3
+has neighbor-index of 01 (n1 has 00 and n0 has 10) with repect to n2.
+
+Thus, the nix-vector for the path from n0 to n3 is 101.
+
+.. note::
+   This neighbor-index or nix-index has total number of bits equal to
+   minimum number of bits required to represent all the neighbors in
+   their binary form.
+
+.. note::
+   If there are multiple netdevices connected to the current netdevice
+   on the channel then it depends on which order netdevices were added
+   to the channel.
+
+   #. Using IPv4:
+   .. code-block:: bash
+
+      # By default IPv4 network is selected
+      ./waf --run src/nix-vector-routing/examples/nix-simple
+
+   #. Using IPv6:
+   .. code-block:: bash
+
+      # Use the --useIPv6 flag
+      ./waf --run "src/nix-vector-routing/examples/nix-simple --useIPv6"
+
+* nms-p2p-nix.cc
+
+This example demonstrates the advantage of Nix-Vector routing as Nix
+performs source-based routing (BFS) to have faster routing.
+
+.. image:: figures/nms.png
+   :alt: NMS P2P Network Diagram
+
+   #. Using IPv4:
+   .. code-block:: bash
+
+      # By default IPv4 network is selected
+      ./waf --run src/nix-vector-routing/examples/nms-p2p-nix
+
+   #. Using IPv6:
+   .. code-block:: bash
+
+      # Use the --useIPv6 flag
+      ./waf --run "src/nix-vector-routing/examples/nms-p2p-nix --useIPv6"
+
+*  nix-simple-multi-address.cc
+
+This is an IPv4 example demonstrating multiple interface addresses. This
+example also shows how address assignment in between the simulation causes
+the all the route caches and Nix caches to flush.
+
+.. code-block:: bash
+
+   # By default IPv4 network is selected
+   ./waf --run src/nix-vector-routing/examples/nix-simple-multi-address
+
+*  nix-double-wifi.cc
+
+This example demonstrates the working of Nix with two Wifi networks
+operating on the same Wifi channel object. The example uses ``ns3::YansWifiChannel``
+for both the wifi networks.
+
+   #. Using IPv4:
+   .. code-block:: bash
+
+      # By default IPv4 network is selected
+      ./waf --run src/nix-vector-routing/examples/nix-double-wifi
+      # Use the --enableNixLog to enable NixVectorRouting logging.
+      ./waf --run "src/nix-vector-routing/examples/nix-double-wifi --enableNixLog"
+
+   #. Using IPv6:
+   .. code-block:: bash
+
+      # Use the --useIPv6 flag
+      ./waf --run "src/nix-vector-routing/examples/nix-double-wifi --useIPv6"
+      # Use the --enableNixLog to enable NixVectorRouting logging.
+      ./waf --run "src/nix-vector-routing/examples/nix-double-wifi --useIPv6 --enableNixLog"
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/examples/nix-double-wifi.cc ns-3.35/src/nix-vector-routing/examples/nix-double-wifi.cc
--- ns-3.34/src/nix-vector-routing/examples/nix-double-wifi.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/nix-vector-routing/examples/nix-double-wifi.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,262 @@
+/* -*- 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
+ *
+ * This example is inspired from examples/tutorial/third.cc by
+ * substituting the CSMA network with another WiFi network.
+ *
+ * Author: Ameya Deshpande <ameyanrd@outlook.com>
+ */
+
+#include "ns3/core-module.h"
+#include "ns3/point-to-point-module.h"
+#include "ns3/network-module.h"
+#include "ns3/applications-module.h"
+#include "ns3/mobility-module.h"
+#include "ns3/csma-module.h"
+#include "ns3/internet-module.h"
+#include "ns3/wifi-module.h"
+#include "ns3/ssid.h"
+#include "ns3/nix-vector-routing-module.h"
+
+/**
+ * This example demonstrates how Nix works with
+ * two Wifi networks on the same channel.
+ *
+ * IPv4 Network Topology
+ * \verbatim
+    Wifi 10.1.1.0/24
+                   AP
+    *    *    *    *
+    |    |    |    |   10.1.2.0/24
+   n5   n6   n7   n0 -------------- n1   n2   n3   n4
+                     point-to-point  |    |    |    |
+                                     *    *    *    *
+                                    AP
+                                      Wifi 10.1.3.0/24
+   \endverbatim
+ *
+ * \verbatim
+    Wifi 2001:1::/64
+                   AP
+    *    *    *    *
+    |    |    |    |   2001:2::/64
+   n5   n6   n7   n0 -------------- n1   n2   n3   n4
+                     point-to-point  |    |    |    |
+                                     *    *    *    *
+                                    AP
+                                      Wifi 2001:3::/64
+   \endverbatim
+ *
+ * Expected Outputs:
+ * IPv4:
+ * \verbatim
+   Time: +7s, Nix Routing
+   Route Path: (Node 4 to Node 7, Nix Vector: 100011)
+   10.1.1.3                 (Node 4)  ---->   10.1.1.4                 (Node 0)
+   10.1.2.1                 (Node 0)  ---->   10.1.2.2                 (Node 1)
+   10.1.3.4                 (Node 1)  ---->   10.1.3.3                 (Node 7)
+   \endverbatim
+ *
+ * IPv6:
+ * \verbatim
+   Time: +7s, Nix Routing
+   Route Path: (Node 4 to Node 7, Nix Vector: 100011)
+   2001:1::200:ff:fe00:5    (Node 4)  ---->   fe80::200:ff:fe00:6      (Node 0)
+   fe80::200:ff:fe00:1      (Node 0)  ---->   fe80::200:ff:fe00:2      (Node 1)
+   fe80::200:ff:fe00:a      (Node 1)  ---->   2001:3::200:ff:fe00:9    (Node 7)
+   \endverbatim
+ */
+
+using namespace ns3;
+
+NS_LOG_COMPONENT_DEFINE ("NixDoubleWifiExample");
+
+int
+main (int argc, char *argv[])
+{
+  bool useIpv6 = false;
+  bool enableNixLog = false;
+
+  CommandLine cmd (__FILE__);
+  cmd.AddValue ("useIPv6", "Use IPv6 instead of IPv4", useIpv6);
+  cmd.AddValue ("enableNixLog", "Enable NixVectorRouting logging", enableNixLog);
+  cmd.Parse (argc,argv);
+
+  LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
+  LogComponentEnable ("UdpEchoServerApplication", LOG_LEVEL_INFO);
+  if (enableNixLog)
+    {
+      LogComponentEnable ("NixVectorRouting", LOG_LEVEL_LOGIC);
+    }
+
+  NodeContainer p2pNodes;
+  p2pNodes.Create (2);
+
+  PointToPointHelper pointToPoint;
+  pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
+  pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
+
+  NetDeviceContainer p2pDevices;
+  p2pDevices = pointToPoint.Install (p2pNodes);
+
+  NodeContainer wifiStaNodes1;
+  wifiStaNodes1.Create (3);
+  NodeContainer wifiApNode1 = p2pNodes.Get (0);
+
+  NodeContainer wifiStaNodes2;
+  wifiStaNodes2.Create (3);
+  NodeContainer wifiApNode2 = p2pNodes.Get (1);
+
+  YansWifiChannelHelper channel = YansWifiChannelHelper::Default ();
+  YansWifiPhyHelper phy;
+  phy.SetChannel (channel.Create ());
+
+  WifiHelper wifi;
+  wifi.SetRemoteStationManager ("ns3::AarfWifiManager");
+
+  WifiMacHelper mac;
+  Ssid ssid = Ssid ("ns-3-ssid-first");
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (ssid),
+               "ActiveProbing", BooleanValue (false));
+
+  NetDeviceContainer staDevices1;
+  staDevices1 = wifi.Install (phy, mac, wifiStaNodes1);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (ssid));
+
+  NetDeviceContainer apDevices1;
+  apDevices1 = wifi.Install (phy, mac, wifiApNode1);
+
+  ssid = Ssid ("ns-3-ssid-second");
+  mac.SetType ("ns3::StaWifiMac",
+               "Ssid", SsidValue (ssid),
+               "ActiveProbing", BooleanValue (false));
+
+  NetDeviceContainer staDevices2;
+  staDevices2 = wifi.Install (phy, mac, wifiStaNodes2);
+
+  mac.SetType ("ns3::ApWifiMac",
+               "Ssid", SsidValue (ssid));
+
+  NetDeviceContainer apDevices2;
+  apDevices2 = wifi.Install (phy, mac, wifiApNode2);
+
+  MobilityHelper mobility;
+
+  mobility.SetPositionAllocator ("ns3::GridPositionAllocator",
+                                 "MinX", DoubleValue (0.0),
+                                 "MinY", DoubleValue (0.0),
+                                 "DeltaX", DoubleValue (5.0),
+                                 "DeltaY", DoubleValue (10.0),
+                                 "GridWidth", UintegerValue (3),
+                                 "LayoutType", StringValue ("RowFirst"));
+
+  mobility.SetMobilityModel ("ns3::RandomWalk2dMobilityModel",
+                             "Bounds", RectangleValue (Rectangle (-50, 50, -50, 50)));
+  mobility.Install (wifiStaNodes1);
+  mobility.Install (wifiStaNodes2);
+
+  mobility.SetMobilityModel ("ns3::ConstantPositionMobilityModel");
+  mobility.Install (wifiApNode1);
+  mobility.Install (wifiApNode2);
+
+  Address udpServerAddress;
+
+  if (!useIpv6)
+    {
+      InternetStackHelper stack;
+      Ipv4NixVectorHelper nixRouting;
+      stack.SetRoutingHelper (nixRouting);
+      stack.Install (wifiApNode1);
+      stack.Install (wifiStaNodes1);
+      stack.Install (wifiApNode2);
+      stack.Install (wifiStaNodes2);
+
+      Ipv4AddressHelper address;
+
+      address.SetBase ("10.1.1.0", "255.255.255.0");
+      address.Assign (staDevices1);
+      address.Assign (apDevices1);
+
+      address.SetBase ("10.1.2.0", "255.255.255.0");
+      Ipv4InterfaceContainer p2pInterfaces;
+      p2pInterfaces = address.Assign (p2pDevices);
+
+      address.SetBase ("10.1.3.0", "255.255.255.0");
+      Ipv4InterfaceContainer staDevicesInterfaces2;
+      staDevicesInterfaces2 = address.Assign (staDevices2);
+      address.Assign (apDevices2);
+
+      udpServerAddress = staDevicesInterfaces2.GetAddress (2);
+
+      Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-double-wifi-ipv4.routes", std::ios::out);
+      nixRouting.PrintRoutingPathAt (Seconds (7), wifiStaNodes1.Get (2), staDevicesInterfaces2.GetAddress (2), routingStream);
+    }
+  else
+    {
+      InternetStackHelper stack;
+      Ipv6NixVectorHelper nixRouting;
+      stack.SetRoutingHelper (nixRouting);
+      stack.Install (wifiApNode1);
+      stack.Install (wifiStaNodes1);
+      stack.Install (wifiApNode2);
+      stack.Install (wifiStaNodes2);
+
+      Ipv6AddressHelper address;
+
+      address.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
+      address.Assign (staDevices1);
+      address.Assign (apDevices1);
+
+      address.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+      Ipv6InterfaceContainer p2pInterfaces;
+      p2pInterfaces = address.Assign (p2pDevices);
+
+      address.SetBase (Ipv6Address ("2001:3::"), Ipv6Prefix (64));
+      Ipv6InterfaceContainer staDevicesInterfaces2;
+      staDevicesInterfaces2 = address.Assign (staDevices2);
+      address.Assign (apDevices2);
+
+      udpServerAddress = staDevicesInterfaces2.GetAddress (2, 1);
+
+      Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-double-wifi-ipv6.routes", std::ios::out);
+      nixRouting.PrintRoutingPathAt (Seconds (7), wifiStaNodes1.Get (2), staDevicesInterfaces2.GetAddress (2, 1), routingStream);
+    }
+
+  UdpEchoServerHelper echoServer (9);
+
+  ApplicationContainer serverApps = echoServer.Install (wifiStaNodes2.Get (2));
+  serverApps.Start (Seconds (1.0));
+  serverApps.Stop (Seconds (10.0));
+
+  UdpEchoClientHelper echoClient (udpServerAddress, 9);
+  echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
+  echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.0)));
+  echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
+
+  ApplicationContainer clientApps = echoClient.Install (wifiStaNodes1.Get (2));
+  clientApps.Start (Seconds (2.0));
+  clientApps.Stop (Seconds (10.0));
+
+  Simulator::Stop (Seconds (10.0));
+
+  Simulator::Run ();
+  Simulator::Destroy ();
+  return 0;
+}
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/examples/nix-simple.cc ns-3.35/src/nix-vector-routing/examples/nix-simple.cc
--- ns-3.34/src/nix-vector-routing/examples/nix-simple.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/examples/nix-simple.cc	2021-10-01 13:26:47.000000000 -0700
@@ -1,5 +1,7 @@
 /* -*- 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;
@@ -12,6 +14,9 @@
  * 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
+ *
+ * Modified By: Ameya Deshpande <ameyanrd@outlook.com>
+ *              Tommaso Pecorella <tommaso.pecorella@unifi.it>
  */
 
 #include "ns3/core-module.h"
@@ -21,7 +26,9 @@
 #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"
+#include "ns3/ipv6-static-routing-helper.h"
+#include "ns3/ipv6-list-routing-helper.h"
+#include "ns3/nix-vector-helper.h"
 
 /**
  * This program demonstrates two types of
@@ -35,10 +42,30 @@
       /        \
     n0 -- n1 -- n2 -- n3
 
+    Using IPv4:
     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
+
+    Using IPv6: (parenthesis mentions the link for node
+                 interface associated)
+    n0 IP: 2001:1::200:ff:fe00:1 (Global Unicast on n0 -- n1)
+           2001:4::200:ff:fe00:7 (Global Unicast on n0 -- n2)
+           fe80::200:ff:fe00:1 (Link-local on n0 -- n1)
+           fe80::200:ff:fe00:7 (Link-local on n0 -- n2)
+    n1 IP: 2001:1::200:ff:fe00:2 (Global Unicast on n0 -- n1)
+           2001:2::200:ff:fe00:3 (Global Unicast on n1 -- n2)
+           fe80::200:ff:fe00:2 (Link-local on n0 -- n1)
+           fe80::200:ff:fe00:3 (Link-local on n0 -- n2)
+    n2 IP: 2001:2::200:ff:fe00:4 (Global Unicast on n1 -- n2)
+           2001:3::200:ff:fe00:5 (Global Unicast on n2 -- n3)
+           2001:4::200:ff:fe00:8 (Global Unicast on n0 -- n2)
+           fe80::200:ff:fe00:4 (Link-local on n1 -- n2)
+           fe80::200:ff:fe00:5 (Link-local on n2 -- n3)
+           fe80::200:ff:fe00:8 (Link-local on n0 -- n2)
+    n3 IP: 2001:3::200:ff:fe00:6 (Global Unicast on n2 -- n3)
+           fe80::200:ff:fe00:6 (Link-local on n2 -- n3)
    \endverbatim
  *
  * Route Path for considered cases:
@@ -52,7 +79,7 @@
  *   It goes from n1 -> n1
  * .
  * \verbatim
-   Expected Routing Path output for above
+   Expected IPv4 Routing Path output for above
    cases (in the output stream):
    Time: +3s, Nix Routing
    Route Path: (Node 0 to Node 3, Nix Vector: 101)
@@ -106,6 +133,59 @@
    Destination     Gateway         Source            OutputDevice
    10.1.4.1        10.1.3.1        10.1.3.2          1
    \endverbatim
+ *
+ * \verbatim
+   Expected IPv6 Routing Path output for above
+   cases (in the output stream):
+   Time: +3s, Nix Routing
+   Route Path: (Node 0 to Node 3, Nix Vector: 101)
+   2001:4::200:ff:fe00:7    (Node 0)  ---->   fe80::200:ff:fe00:8      (Node 2)
+   fe80::200:ff:fe00:5      (Node 2)  ---->   2001:3::200:ff:fe00:6    (Node 3)
+
+   Time: +5s, Nix Routing
+   Route Path: (Node 1 to Node 3, Nix Vector: 101)
+   2001:2::200:ff:fe00:3    (Node 1)  ---->   fe80::200:ff:fe00:4      (Node 2)
+   fe80::200:ff:fe00:5      (Node 2)  ---->   2001:3::200:ff:fe00:6    (Node 3)
+
+   Time: +6s, Nix Routing
+   Route Path: (Node 2 to Node 0, Nix Vector: 10)
+   2001:4::200:ff:fe00:8    (Node 2)  ---->   2001:1::200:ff:fe00:1    (Node 0)
+
+   Time: +7s, Nix Routing
+   Route Path: (Node 1 to Node 1, Nix Vector: )
+   2001:1::200:ff:fe00:2    (Node 1)  ---->   2001:1::200:ff:fe00:2    (Node 1)
+
+   Node: 0, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination                   NixVector
+   2001:3::200:ff:fe00:6         101
+   IpRouteCache:
+   Destination                   Gateway                       Source                        OutputDevice
+   2001:3::200:ff:fe00:6         fe80::200:ff:fe00:8           2001:4::200:ff:fe00:7           1
+
+   Node: 1, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination                   NixVector
+   2001:3::200:ff:fe00:6         101
+   IpRouteCache:
+
+   Node: 2, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination                   NixVector
+   2001:1::200:ff:fe00:1         10
+   IpRouteCache:
+   Destination                   Gateway                       Source                        OutputDevice
+   2001:3::200:ff:fe00:6         fe80::200:ff:fe00:6           fe80::200:ff:fe00:5             1
+   2001:4::200:ff:fe00:7         fe80::200:ff:fe00:7           fe80::200:ff:fe00:8             2
+
+   Node: 3, Time: +8s, Local time: +8s, Nix Routing
+   NixCache:
+   Destination                   NixVector
+   2001:4::200:ff:fe00:7         010
+   IpRouteCache:
+   Destination                   Gateway                       Source                        OutputDevice
+   2001:4::200:ff:fe00:7         fe80::200:ff:fe00:5           2001:3::200:ff:fe00:6           0
+   \endverbatim
  */
 
 using namespace ns3;
@@ -115,7 +195,10 @@
 int
 main (int argc, char *argv[])
 {
+  bool useIpv6 = false;
+
   CommandLine cmd (__FILE__);
+  cmd.AddValue ("useIPv6", "Use IPv6 instead of IPv4", useIpv6);
   cmd.Parse (argc, argv);
 
   LogComponentEnable ("UdpEchoClientApplication", LOG_LEVEL_INFO);
@@ -142,13 +225,6 @@
 
   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;
@@ -158,27 +234,84 @@
   devices34 = pointToPoint.Install (nodes34);
   devices13 = pointToPoint.Install (nodes13);
 
-  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.1.4.0", "255.255.255.0");
-
-  Ipv4InterfaceContainer interfaces12 = address1.Assign (devices12);
-  Ipv4InterfaceContainer interfaces23 = address2.Assign (devices23);
-  Ipv4InterfaceContainer interfaces34 = address3.Assign (devices34);
-  Ipv4InterfaceContainer interfaces13 = address4.Assign (devices13);
+  Address udpServerAddress;
 
+  if (!useIpv6)
+    {
+      // 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);
+
+      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.1.4.0", "255.255.255.0");
+
+      Ipv4InterfaceContainer interfaces12 = address1.Assign (devices12);
+      Ipv4InterfaceContainer interfaces23 = address2.Assign (devices23);
+      Ipv4InterfaceContainer interfaces34 = address3.Assign (devices34);
+      Ipv4InterfaceContainer interfaces13 = address4.Assign (devices13);
+
+      udpServerAddress = interfaces34.GetAddress (1);
+
+      // Trace routing paths for different source and destinations.
+      Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-simple-ipv4.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);
+    }
+  else
+    {
+      // NixHelper to install nix-vector routing
+      // on all nodes
+      Ipv6NixVectorHelper nixRouting;
+      InternetStackHelper stack;
+      stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
+      stack.Install (allNodes);
+
+      Ipv6AddressHelper address1;
+      address1.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
+      Ipv6AddressHelper address2;
+      address2.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+      Ipv6AddressHelper address3;
+      address3.SetBase (Ipv6Address ("2001:3::"), Ipv6Prefix (64));
+      Ipv6AddressHelper address4;
+      address4.SetBase (Ipv6Address ("2001:4::"), Ipv6Prefix (64));
+
+      Ipv6InterfaceContainer interfaces12 = address1.Assign (devices12);
+      Ipv6InterfaceContainer interfaces23 = address2.Assign (devices23);
+      Ipv6InterfaceContainer interfaces34 = address3.Assign (devices34);
+      Ipv6InterfaceContainer interfaces13 = address4.Assign (devices13);
+
+      udpServerAddress = interfaces34.GetAddress (1, 1);
+
+      // Trace routing paths for different source and destinations.
+      Ptr<OutputStreamWrapper> routingStream = Create<OutputStreamWrapper> ("nix-simple-ipv6.routes", std::ios::out);
+      nixRouting.PrintRoutingPathAt (Seconds (3), nodes12.Get (0), interfaces34.GetAddress (1, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (5), nodes12.Get (1), interfaces34.GetAddress (1, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (6), nodes23.Get (1), interfaces12.GetAddress (0, 1), routingStream);
+      nixRouting.PrintRoutingPathAt (Seconds (7), nodes12.Get (1), interfaces12.GetAddress (1, 1), routingStream);
+      // Trace routing tables
+      nixRouting.PrintRoutingTableAllAt (Seconds (8), routingStream);
+    }
+  
   UdpEchoServerHelper echoServer (9);
 
   ApplicationContainer serverApps = echoServer.Install (nodes34.Get (1));
   serverApps.Start (Seconds (1.0));
   serverApps.Stop (Seconds (10.0));
 
-  UdpEchoClientHelper echoClient (interfaces34.GetAddress (1), 9);
+  UdpEchoClientHelper echoClient (udpServerAddress, 9);
   echoClient.SetAttribute ("MaxPackets", UintegerValue (1));
   echoClient.SetAttribute ("Interval", TimeValue (Seconds (1.)));
   echoClient.SetAttribute ("PacketSize", UintegerValue (1024));
@@ -187,15 +320,6 @@
   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.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 ();
   Simulator::Destroy ();
   return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/examples/nix-simple-multi-address.cc ns-3.35/src/nix-vector-routing/examples/nix-simple-multi-address.cc
--- ns-3.34/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/examples/nix-simple-multi-address.cc	2021-10-01 13:26:47.000000000 -0700
@@ -26,7 +26,7 @@
 #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"
+#include "ns3/nix-vector-helper.h"
 
 /**
  * This program demonstrates a routing and
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/examples/nms-p2p-nix.cc ns-3.35/src/nix-vector-routing/examples/nms-p2p-nix.cc
--- ns-3.34/src/nix-vector-routing/examples/nms-p2p-nix.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/examples/nms-p2p-nix.cc	2021-10-01 13:26:47.000000000 -0700
@@ -1,5 +1,8 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
+ * Copyright (c) 2009, GTech Systems, Inc.
+ * Copyright (c) 2021 NITK Surathkal: Extended to handle IPv6
+ *
  * 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;
@@ -13,8 +16,12 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * (c) 2009, GTech Systems, Inc. - Alfred Park <park@gtech-systems.com>
- *
+ * Author: Alfred Park <park@gtech-systems.com>
+ * Modified By: Josh Pelkey <jpelkey@gatech.edu> (ported to ns-3)
+ * Modified By: Ameya Deshpande <ameyanrd@outlook.com> (IPv6 extensions)
+ *              Tommaso Pecorella <tommaso.pecorella@unifi.it> (IPv6 extensions)
+ */
+/*
  * DARPA NMS Campus Network Model
  *
  * This topology replicates the original NMS Campus Network model
@@ -24,8 +31,8 @@
  * specifications
  *
  * The fundamental unit of the NMS model consists of a campus network. The
- * campus network topology can been seen here:
- * http://www.nsnam.org/~jpelkey3/nms.png
+ * campus network topology can been seen in the model manual.
+ *
  * The number of hosts (default 42) is variable.  Finally, an arbitrary
  * number of these campus networks can be connected together (default 2)
  * to make very large simulations.
@@ -44,7 +51,7 @@
 #include "ns3/onoff-application.h"
 #include "ns3/packet-sink.h"
 #include "ns3/simulator.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 
 using namespace ns3;
 
@@ -157,13 +164,21 @@
 
   int nCN = 2, nLANClients = 42;
   bool nix = true;
+  bool useIpv6 = false;
 
   CommandLine cmd (__FILE__);
+  cmd.AddValue ("useIPv6", "Use IPv6 instead of IPv4", useIpv6);
   cmd.AddValue ("CN", "Number of total CNs [2]", nCN);
   cmd.AddValue ("LAN", "Number of nodes per LAN [42]", nLANClients);
   cmd.AddValue ("NIX", "Toggle nix-vector routing", nix);
   cmd.Parse (argc,argv);
 
+  if (useIpv6 && !nix)
+    {
+      std::cout << "This script can work in IPv6 only by using NIX"
+           << std::endl;
+      return 1;
+    }
   if (nCN < 2) 
     {
       std::cout << "Number of total CNs (" << nCN << ") lower than minimum of 2"
@@ -183,15 +198,11 @@
 
   PointToPointHelper p2p_2gb200ms, p2p_1gb5ms, p2p_100mb1ms;
   InternetStackHelper stack;
-  Ipv4InterfaceContainer ifs;
-  Array2D<Ipv4InterfaceContainer> ifs0(nCN, 3);
-  Array2D<Ipv4InterfaceContainer> ifs1(nCN, 6);
-  Array2D<Ipv4InterfaceContainer> ifs2(nCN, 14);
-  Array2D<Ipv4InterfaceContainer> ifs3(nCN, 9);
-  Array3D<Ipv4InterfaceContainer> ifs2LAN(nCN, 7, nLANClients);
-  Array3D<Ipv4InterfaceContainer> ifs3LAN(nCN, 5, nLANClients);
+  Array3D<Address> ifs2LanRemoteAddress(nCN, 7, nLANClients);
+  Array3D<Address> ifs3LanRemoteAddress(nCN, 5, nLANClients);
 
-  Ipv4AddressHelper address;
+  Ipv4AddressHelper addressHelperv4;
+  Ipv6AddressHelper addressHelperv6;
   std::ostringstream oss;
   p2p_1gb5ms.SetDeviceAttribute ("DataRate", StringValue ("1Gbps"));
   p2p_1gb5ms.SetChannelAttribute ("Delay", StringValue ("5ms"));
@@ -203,8 +214,16 @@
   // Setup NixVector Routing
   if (nix)
     {
-      Ipv4NixVectorHelper nixRouting;
-      stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
+      if (!useIpv6)
+        {
+          Ipv4NixVectorHelper nixRouting;
+          stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
+        }
+      else
+        {
+          Ipv6NixVectorHelper nixRouting;
+          stack.SetRoutingHelper (nixRouting); // has effect on the next Install ()
+        }
     }
 
   // Create Campus Networks
@@ -254,9 +273,18 @@
       NetDeviceContainer ndc0_1;
       ndc0_1 = p2p_1gb5ms.Install (net0_1);
       oss.str ("");
-      oss << 10 + z << ".1.252.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc0_1);
+      if (!useIpv6)
+        {
+          oss << 10 + z << ".1.252.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc0_1);
+        }
+      else
+        {
+          oss << 2001 + z << ":1:252::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc0_1);
+        }
       // Create Net2
       std::cout << " 2";
       for (int i = 0; i < 14; ++i) 
@@ -283,20 +311,34 @@
         {
           ndc2[i] = p2p_1gb5ms.Install (nodes_net2[z][i]);
         }
-///      NetDeviceContainer ndc2LAN[7][nLANClients];
       Array2D<NetDeviceContainer> ndc2LAN(7, nLANClients);
       for (int i = 0; i < 7; ++i) 
         {
           oss.str ("");
-          oss << 10 + z << ".4." << 15 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.0");
+          if (!useIpv6)
+            {
+              oss << 10 + z << ".4." << 15 + i << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+            }
+          else
+            {
+              oss << 2001 + z << ":4:" << 15 + i << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+            }
           for (int j = 0; j < nLANClients; ++j) 
             {
               nodes_net2LAN[z][i][j].Create (1);
               stack.Install (nodes_net2LAN[z][i][j]);
               nodes_net2LAN[z][i][j].Add (nodes_net2[z][i+7].Get (0));
               ndc2LAN[i][j] = p2p_100mb1ms.Install (nodes_net2LAN[z][i][j]);
-              ifs2LAN[z][i][j] = address.Assign (ndc2LAN[i][j]);
+              if (!useIpv6)
+                {
+                  ifs2LanRemoteAddress[z][i][j] = InetSocketAddress (addressHelperv4.Assign (ndc2LAN[i][j]).GetAddress (0), 9999);
+                }
+              else
+                {
+                  ifs2LanRemoteAddress[z][i][j] = Inet6SocketAddress (addressHelperv6.Assign (ndc2LAN[i][j]).GetAddress (0,1), 9999);
+                }
             }
         }
       // Create Net3
@@ -320,20 +362,35 @@
         {
           ndc3[i] = p2p_1gb5ms.Install (nodes_net3[z][i]);
         }
-///      NetDeviceContainer ndc3LAN[5][nLANClients];
       Array2D<NetDeviceContainer> ndc3LAN(5, nLANClients);
       for (int i = 0; i < 5; ++i) 
         {
           oss.str ("");
-          oss << 10 + z << ".5." << 10 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.255");
+          if (!useIpv6)
+            {
+              oss << 10 + z << ".5." << 10 + i << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+            }
+          else
+            {
+              oss << 2001 + z << ":5:" << 10 + i << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+
+            }
           for (int j = 0; j < nLANClients; ++j) 
             {
               nodes_net3LAN[z][i][j].Create (1);
               stack.Install (nodes_net3LAN[z][i][j]);
               nodes_net3LAN[z][i][j].Add (nodes_net3[z][i+4].Get (0));
               ndc3LAN[i][j] = p2p_100mb1ms.Install (nodes_net3LAN[z][i][j]);
-              ifs3LAN[z][i][j] = address.Assign (ndc3LAN[i][j]);
+              if (!useIpv6)
+                {
+                  ifs3LanRemoteAddress[z][i][j] = InetSocketAddress (addressHelperv4.Assign (ndc3LAN[i][j]).GetAddress (0), 9999);
+                }
+              else
+                {
+                  ifs3LanRemoteAddress[z][i][j] = Inet6SocketAddress (addressHelperv6.Assign (ndc3LAN[i][j]).GetAddress (0, 1), 9999);
+                }
             }
         }
       std::cout << "  Connecting Subnets..." << std::endl;
@@ -358,43 +415,98 @@
       net3_5b.Add (nodes_net3[z][1].Get (0));
       NetDeviceContainer ndc0_4, ndc0_5, ndc2_4a, ndc2_4b, ndc3_5a, ndc3_5b;
       ndc0_4 = p2p_1gb5ms.Install (net0_4);
-      oss.str ("");
-      oss << 10 + z << ".1.253.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc0_4);
       ndc0_5 = p2p_1gb5ms.Install (net0_5);
-      oss.str ("");
-      oss << 10 + z << ".1.254.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc0_5);
       ndc2_4a = p2p_1gb5ms.Install (net2_4a);
-      oss.str ("");
-      oss << 10 + z << ".4.253.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc2_4a);
       ndc2_4b = p2p_1gb5ms.Install (net2_4b);
-      oss.str ("");
-      oss << 10 + z << ".4.254.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc2_4b);
       ndc3_5a = p2p_1gb5ms.Install (net3_5a);
-      oss.str ("");
-      oss << 10 + z << ".5.253.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc3_5a);
       ndc3_5b = p2p_1gb5ms.Install (net3_5b);
-      oss.str ("");
-      oss << 10 + z << ".5.254.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndc3_5b);
+
       // Assign IP addresses
+
+      if (!useIpv6)
+        {
+          // ndc0_4
+          oss.str ("");
+          oss << 10 + z << ".1.253.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc0_4);
+          // ndc0_5
+          oss.str ("");
+          oss << 10 + z << ".1.254.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc0_5);
+          // ndc2_4a
+          oss.str ("");
+          oss << 10 + z << ".4.253.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc2_4a);
+          // ndc2_4b
+          oss.str ("");
+          oss << 10 + z << ".4.254.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc2_4b);
+          // ndc3_5a
+          oss.str ("");
+          oss << 10 + z << ".5.253.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc3_5a);
+          // ndc3_5b
+          oss.str ("");
+          oss << 10 + z << ".5.254.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndc3_5b);
+        }
+      else
+        {
+          // ndc0_4
+          oss.str ("");
+          oss << 2001 + z << ":1:253::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc0_4);
+          // ndc0_5
+          oss.str ("");
+          oss << 2001 + z << ":1:254::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc0_5);
+          // ndc2_4a
+          oss.str ("");
+          oss << 2001 + z << ":4:253::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc2_4a);
+          // ndc2_4b
+          oss.str ("");
+          oss << 2001 + z << ":4:254::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc2_4b);
+          // ndc3_5a
+          oss.str ("");
+          oss << 2001 + z << ":5:253::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc3_5a);
+          // ndc3_5b
+          oss.str ("");
+          oss << 2001 + z << ":5:254::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndc3_5b);
+
+        }
+
       std::cout << "  Assigning IP addresses..." << std::endl;
       for (int i = 0; i < 3; ++i) 
         {
           oss.str ("");
-          oss << 10 + z << ".1." << 1 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.0");
-          ifs0[z][i] = address.Assign (ndc0[i]);
+          if (!useIpv6)
+            {
+              oss << 10 + z << ".1." << 1 + i << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+              addressHelperv4.Assign (ndc0[i]);
+            }
+          else
+            {
+              oss << 2001 + z << ":1:" << 1 + i << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+              addressHelperv6.Assign (ndc0[i]);
+            }
         }
       for (int i = 0; i < 6; ++i) 
         {
@@ -403,27 +515,65 @@
               continue;
             }
           oss.str ("");
-          oss << 10 + z << ".2." << 1 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.0");
-          ifs1[z][i] = address.Assign (ndc1[i]);
+          if (!useIpv6)
+            {
+              oss << 10 + z << ".2." << 1 + i << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+              addressHelperv4.Assign (ndc1[i]);
+            }
+          else
+            {
+              oss << 2001 + z << ":2:" << 1 + i << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+              addressHelperv6.Assign (ndc1[i]);
+            }
         }
       oss.str ("");
-      oss << 10 + z << ".3.1.0";
-      address.SetBase (oss.str ().c_str (), "255.255.255.0");
-      ifs = address.Assign (ndcLR);
+      if (!useIpv6)
+        {
+          oss << 10 + z << ".3.1.0";
+          addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+          addressHelperv4.Assign (ndcLR);
+        }
+      else
+        {
+          oss << 2001 + z << ":3:1::";
+          addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+          addressHelperv6.Assign (ndcLR);
+
+        }
       for (int i = 0; i < 14; ++i) 
         {
           oss.str ("");
-          oss << 10 + z << ".4." << 1 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.0");
-          ifs2[z][i] = address.Assign (ndc2[i]);
+          if (!useIpv6)
+            {
+              oss << 10 + z << ".4." << 1 + i << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+              addressHelperv4.Assign (ndc2[i]);
+            }
+          else
+            {
+              oss << 2001 + z << ":4:" << 1 + i << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+              addressHelperv6.Assign (ndc2[i]);
+
+            }
         }
       for (int i = 0; i < 9; ++i) 
         {
           oss.str ("");
-          oss << 10 + z << ".5." << 1 + i << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.0");
-          ifs3[z][i] = address.Assign (ndc3[i]);
+          if (!useIpv6)
+            {
+              oss << 10 + z << ".5." << 1 + i << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+              addressHelperv4.Assign (ndc3[i]);
+            }
+          else
+            {
+              oss << 2001 + z << ":5:" << 1 + i << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+              addressHelperv6.Assign (ndc3[i]);
+            }
         }
     }
   // Create Ring Links
@@ -443,9 +593,18 @@
         {
           ndc_ring[z] = p2p_2gb200ms.Install (nodes_ring[z]);
           oss.str ("");
-          oss << "254.1." << z + 1 << ".0";
-          address.SetBase (oss.str ().c_str (), "255.255.255.0");
-          ifs = address.Assign (ndc_ring[z]);
+          if (!useIpv6)
+            {
+              oss << "254.1." << z + 1 << ".0";
+              addressHelperv4.SetBase (oss.str ().c_str (), "255.255.255.0");
+              addressHelperv4.Assign (ndc_ring[z]);
+            }
+          else
+            {
+              oss << "254:1:" << z + 1 << "::";
+              addressHelperv6.SetBase (oss.str ().c_str (), Ipv6Prefix (64));
+              addressHelperv6.Assign (ndc_ring[z]);
+            }
         }
       delete[] ndc_ring;
       delete[] nodes_ring;
@@ -463,6 +622,17 @@
   Ptr<UniformRandomVariable> urng = CreateObject<UniformRandomVariable> ();
   int r1;
   double r2;
+
+  Address sinkAddress;
+  if (!useIpv6)
+    {
+      sinkAddress = InetSocketAddress (Ipv4Address::GetAny (), 9999);
+    }
+  else
+    {
+      sinkAddress = Inet6SocketAddress (Ipv6Address::GetAny (), 9999);
+    }
+
   for (int z = 0; z < nCN; ++z) 
     {
       int x = z + 1;
@@ -477,8 +647,7 @@
           for (int j = 0; j < nLANClients; ++j) 
             {
               // Sinks
-              PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory",
-                                           InetSocketAddress (Ipv4Address::GetAny (), 9999));
+              PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkAddress);
               ApplicationContainer sinkApp = sinkHelper.Install (
                   nodes_net2LAN[z][i][j].Get (0));
               sinkApp.Start (Seconds (0.0));
@@ -486,8 +655,7 @@
               r1 = 2 + (int)(4 * urng->GetValue ());
               r2 = 10 * urng->GetValue ();
               OnOffHelper client ("ns3::TcpSocketFactory", Address ());
-              AddressValue remoteAddress (InetSocketAddress (
-                                            ifs2LAN[z][i][j].GetAddress (0), 9999));
+              AddressValue remoteAddress (ifs2LanRemoteAddress[z][i][j]);
               client.SetAttribute ("Remote", remoteAddress);
               ApplicationContainer clientApp;
               clientApp.Add (client.Install (nodes_net1[x][r1].Get (0)));
@@ -501,8 +669,7 @@
           for (int j = 0; j < nLANClients; ++j) 
             {
               // Sinks
-              PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory",
-                                           InetSocketAddress (Ipv4Address::GetAny (), 9999));
+              PacketSinkHelper sinkHelper ("ns3::TcpSocketFactory", sinkAddress);
               ApplicationContainer sinkApp = sinkHelper.Install (
                   nodes_net3LAN[z][i][j].Get (0));
               sinkApp.Start (Seconds (0.0));
@@ -510,8 +677,7 @@
               r1 = 2 + (int)(4 * urng->GetValue ());
               r2 = 10 * urng->GetValue ();
               OnOffHelper client ("ns3::TcpSocketFactory", Address ());
-              AddressValue remoteAddress (InetSocketAddress (
-                                            ifs3LAN[z][i][j].GetAddress (0), 9999));
+              AddressValue remoteAddress (ifs3LanRemoteAddress[z][i][j]);
               client.SetAttribute ("Remote", remoteAddress);
               ApplicationContainer clientApp;
               clientApp.Add (client.Install (nodes_net1[x][r1].Get (0)));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/examples/wscript ns-3.35/src/nix-vector-routing/examples/wscript
--- ns-3.34/src/nix-vector-routing/examples/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/examples/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -12,3 +12,7 @@
     obj = bld.create_ns3_program('nix-simple-multi-address',
                                  ['point-to-point', 'applications', 'internet', 'nix-vector-routing'])
     obj.source = 'nix-simple-multi-address.cc'
+
+    obj = bld.create_ns3_program('nix-double-wifi',
+                                 ['point-to-point', 'wifi', 'applications', 'internet', 'nix-vector-routing'])
+    obj.source = 'nix-double-wifi.cc'
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc ns-3.35/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc
--- ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/helper/ipv4-nix-vector-helper.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,65 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 The Georgia Institute 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
- *
- * Authors: Josh Pelkey <jpelkey@gatech.edu>
- */
-
-#include "ipv4-nix-vector-helper.h"
-#include "ns3/ipv4-nix-vector-routing.h"
-
-namespace ns3 {
-
-Ipv4NixVectorHelper::Ipv4NixVectorHelper ()
-{
-  m_agentFactory.SetTypeId ("ns3::Ipv4NixVectorRouting");
-}
-
-Ipv4NixVectorHelper::Ipv4NixVectorHelper (const Ipv4NixVectorHelper &o)
-  : m_agentFactory (o.m_agentFactory)
-{
-}
-
-Ipv4NixVectorHelper* 
-Ipv4NixVectorHelper::Copy (void) const 
-{
-  return new Ipv4NixVectorHelper (*this); 
-}
-
-Ptr<Ipv4RoutingProtocol> 
-Ipv4NixVectorHelper::Create (Ptr<Node> node) const
-{
-  Ptr<Ipv4NixVectorRouting> agent = m_agentFactory.Create<Ipv4NixVectorRouting> ();
-  agent->SetNode (node);
-  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.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h ns-3.35/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h
--- ns-3.34/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/helper/ipv4-nix-vector-helper.h	2021-10-01 13:26:47.000000000 -0700
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2009 The Georgia Institute of Technology 
+ * 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
@@ -15,99 +15,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Authors: Josh Pelkey <jpelkey@gatech.edu>
- */
-
-#ifndef IPV4_NIX_VECTOR_HELPER_H
-#define IPV4_NIX_VECTOR_HELPER_H
-
-#include "ns3/object-factory.h"
-#include "ns3/ipv4-routing-helper.h"
-
-namespace ns3 {
-
-/**
- * \ingroup nix-vector-routing
- *
- * \brief Helper class that adds Nix-vector routing to nodes.
- *
- * This class is expected to be used in conjunction with 
- * ns3::InternetStackHelper::SetRoutingHelper
+ * The purpose of this file is to have backwards compatibility with previous
+ * IPv4 Nix Vector Routing examples and usages.
  *
+ * Authors: Ameya Deshpande <ameyanrd@outlook.com>
  */
-class Ipv4NixVectorHelper : public Ipv4RoutingHelper
-{
-public:
-  /**
-   * Construct an Ipv4NixVectorHelper to make life easier while adding Nix-vector
-   * routing to nodes.
-   */
-  Ipv4NixVectorHelper ();
-
-  /**
-   * \brief Construct an Ipv4NixVectorHelper from another previously 
-   * initialized instance (Copy Constructor).
-   *
-   * \param o object to copy
-   */
-  Ipv4NixVectorHelper (const Ipv4NixVectorHelper &o);
-
-  /**
-   * \returns pointer to clone of this Ipv4NixVectorHelper 
-   * 
-   * This method is mainly for internal use by the other helpers;
-   * clients are expected to free the dynamic memory allocated by this method
-   */
-  Ipv4NixVectorHelper* Copy (void) const;
-
-  /**
-  * \param node the node on which the routing protocol will run
-  * \returns a newly-created routing protocol
-  *
-  * This method will be called by ns3::InternetStackHelper::Install
-  */
-  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
-   * assignment and prevent the compiler from happily inserting its own.
-   * \return Nothing useful.
-   */
-  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
-
-#endif /* IPV4_NIX_VECTOR_HELPER_H */
+#pragma GCC warning "NS_DEPRECATED_3_35 - Deprecated header, please use nix-vector-helper.h instead"
+#include "nix-vector-helper.h"
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/helper/nix-vector-helper.cc ns-3.35/src/nix-vector-routing/helper/nix-vector-helper.cc
--- ns-3.34/src/nix-vector-routing/helper/nix-vector-helper.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/nix-vector-routing/helper/nix-vector-helper.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,84 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 The Georgia Institute of Technology
+ * 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
+ * 
+ * This file is adapted from the old ipv4-nix-vector-helper.cc.
+ *
+ * Authors: Josh Pelkey <jpelkey@gatech.edu>
+ * 
+ * Modified by: Ameya Deshpande <ameyanrd@outlook.com>
+ */
+
+#include "nix-vector-helper.h"
+#include "ns3/nix-vector-routing.h"
+#include "ns3/assert.h"
+
+namespace ns3 {
+
+template <typename T>
+NixVectorHelper<T>::NixVectorHelper ()
+{
+  std::string name = (IsIpv4::value ? "Ipv4" : "Ipv6");
+  m_agentFactory.SetTypeId (("ns3::" + name + "NixVectorRouting").c_str ());
+}
+
+template <typename T>
+NixVectorHelper<T>::NixVectorHelper (const NixVectorHelper<T> &o)
+  : m_agentFactory (o.m_agentFactory)
+{
+  // Check if the T is Ipv4RoutingHelper or Ipv6RoutingHelper.
+  NS_ASSERT_MSG ((IsIpv4::value || std::is_same <Ipv6RoutingHelper, T>::value),
+                  "Template parameter is not Ipv4RoutingHelper or Ipv6Routing Helper");
+}
+
+template <typename T>
+NixVectorHelper<T>*
+NixVectorHelper<T>::Copy (void) const
+{
+  return new NixVectorHelper<T> (*this);
+}
+
+template <typename T>
+Ptr<typename NixVectorHelper<T>::IpRoutingProtocol>
+NixVectorHelper<T>::Create (Ptr<Node> node) const
+{
+  Ptr<NixVectorRouting<IpRoutingProtocol>> agent = m_agentFactory.Create<NixVectorRouting<IpRoutingProtocol>> ();
+  agent->SetNode (node);
+  node->AggregateObject (agent);
+  return agent;
+}
+
+template <typename T>
+void
+NixVectorHelper<T>::PrintRoutingPathAt (Time printTime, Ptr<Node> source, IpAddress dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit)
+{
+  Simulator::Schedule (printTime, &NixVectorHelper<T>::PrintRoute, source, dest, stream, unit);
+}
+
+template <typename T>
+void
+NixVectorHelper<T>::PrintRoute (Ptr<Node> source, IpAddress dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit)
+{
+  Ptr<NixVectorRouting<IpRoutingProtocol>> rp = T::template GetRouting <NixVectorRouting<IpRoutingProtocol>> (source->GetObject<Ip> ()->GetRoutingProtocol ());
+  NS_ASSERT (rp);
+  rp->PrintRoutingPath (source, dest, stream, unit);
+}
+
+template class NixVectorHelper<Ipv4RoutingHelper>;
+template class NixVectorHelper<Ipv6RoutingHelper>;
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/helper/nix-vector-helper.h ns-3.35/src/nix-vector-routing/helper/nix-vector-helper.h
--- ns-3.34/src/nix-vector-routing/helper/nix-vector-helper.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/nix-vector-routing/helper/nix-vector-helper.h	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,147 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 The Georgia Institute of Technology
+ * 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
+ * 
+ * This file is adapted from the old ipv4-nix-vector-helper.h.
+ *
+ * Authors: Josh Pelkey <jpelkey@gatech.edu>
+ * 
+ * Modified by: Ameya Deshpande <ameyanrd@outlook.com>
+ */
+
+#ifndef NIX_VECTOR_HELPER_H
+#define NIX_VECTOR_HELPER_H
+
+#include "ns3/object-factory.h"
+#include "ns3/ipv4-routing-helper.h"
+#include "ns3/ipv6-routing-helper.h"
+
+namespace ns3 {
+
+/**
+ * \ingroup nix-vector-routing
+ *
+ * \brief Helper class that adds Nix-vector routing to nodes.
+ *
+ * This class is expected to be used in conjunction with 
+ * ns3::InternetStackHelper::SetRoutingHelper
+ *
+ * \internal
+ * Since this class is meant to be specialized only by Ipv4RoutingHelper or 
+ * Ipv6RoutingHelper the implementation of this class doesn't need to be
+ * exposed here; it is in nix-vector-helper.cc.
+
+ */
+template <typename T>
+class NixVectorHelper : public std::enable_if<std::is_same<Ipv4RoutingHelper, T>::value || std::is_same<Ipv6RoutingHelper, T>::value, T>::type
+{
+  /// Alias for determining whether the parent is Ipv4RoutingHelper or Ipv6RoutingHelper
+  using IsIpv4 = std::is_same <Ipv4RoutingHelper, T>;
+  /// Alias for Ipv4 and Ipv6 classes
+  using Ip = typename std::conditional <IsIpv4::value, Ipv4, Ipv6>::type;
+  /// Alias for Ipv4Address and Ipv6Address classes
+  using IpAddress = typename std::conditional<IsIpv4::value, Ipv4Address, Ipv6Address>::type;
+  /// Alias for Ipv4RoutingProtocol and Ipv6RoutingProtocol classes
+  using IpRoutingProtocol = typename std::conditional<IsIpv4::value, Ipv4RoutingProtocol, Ipv6RoutingProtocol>::type;
+public:
+  /**
+   * Construct an NixVectorHelper to make life easier while adding Nix-vector
+   * routing to nodes.
+   */
+  NixVectorHelper ();
+
+  /**
+   * \brief Construct an NixVectorHelper from another previously
+   * initialized instance (Copy Constructor).
+   *
+   * \param o object to copy
+   */
+  NixVectorHelper (const NixVectorHelper<T> &o);
+
+  /**
+   * \returns pointer to clone of this NixVectorHelper
+   * 
+   * This method is mainly for internal use by the other helpers;
+   * clients are expected to free the dynamic memory allocated by this method
+   */
+  NixVectorHelper<T>* Copy (void) const;
+
+  /**
+  * \param node the node on which the routing protocol will run
+  * \returns a newly-created routing protocol
+  *
+  * This method will be called by ns3::InternetStackHelper::Install
+  */
+  virtual Ptr<IpRoutingProtocol> 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 IP 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
+   * NixVectorRouting for the source and destination to provide
+   * the routing path at the specified time.
+   */
+  void PrintRoutingPathAt (Time printTime, Ptr<Node> source, IpAddress dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S);
+
+private:
+  /**
+   * \brief Assignment operator declared private and not implemented to disallow
+   * assignment and prevent the compiler from happily inserting its own.
+   * \return Nothing useful.
+   */
+  NixVectorHelper &operator = (const NixVectorHelper &);
+
+  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 IP 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
+   * NixVectorRouting for the source and destination to provide
+   * the routing path.
+   */
+  static void PrintRoute (Ptr<Node> source, IpAddress dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S);
+};
+
+/**
+ * \ingroup nix-vector-routing
+ * Create the typedef Ipv4NixVectorHelper with T as Ipv4RoutingHelper
+ *
+ * Note: This typedef enables also backwards compatibility with original Ipv4RoutingHelper.
+ */
+typedef NixVectorHelper<Ipv4RoutingHelper> Ipv4NixVectorHelper;
+
+/**
+ * \ingroup nix-vector-routing
+ * Create the typedef Ipv6NixVectorHelper with T as Ipv6RoutingHelper
+ */
+typedef NixVectorHelper<Ipv6RoutingHelper> Ipv6NixVectorHelper;
+} // namespace ns3
+
+#endif /* NIX_VECTOR_HELPER_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc ns-3.35/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc
--- ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/model/ipv4-nix-vector-routing.cc	1969-12-31 16:00:00.000000000 -0800
@@ -1,1104 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2009 The Georgia Institute 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
- *
- * Authors: Josh Pelkey <jpelkey@gatech.edu>
- */
-
-#include <queue>
-#include <iomanip>
-
-#include "ns3/log.h"
-#include "ns3/abort.h"
-#include "ns3/names.h"
-#include "ns3/ipv4-list-routing.h"
-#include "ns3/loopback-net-device.h"
-
-#include "ipv4-nix-vector-routing.h"
-
-namespace ns3 {
-
-NS_LOG_COMPONENT_DEFINE ("Ipv4NixVectorRouting");
-
-NS_OBJECT_ENSURE_REGISTERED (Ipv4NixVectorRouting);
-
-bool Ipv4NixVectorRouting::g_isCacheDirty = false;
-Ipv4NixVectorRouting::Ipv4AddressToNodeMap Ipv4NixVectorRouting::g_ipv4AddressToNodeMap;
-
-TypeId 
-Ipv4NixVectorRouting::GetTypeId (void)
-{
-  static TypeId tid = TypeId ("ns3::Ipv4NixVectorRouting")
-    .SetParent<Ipv4RoutingProtocol> ()
-    .SetGroupName ("NixVectorRouting")
-    .AddConstructor<Ipv4NixVectorRouting> ()
-  ;
-  return tid;
-}
-
-Ipv4NixVectorRouting::Ipv4NixVectorRouting ()
-  : m_totalNeighbors (0)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-}
-
-Ipv4NixVectorRouting::~Ipv4NixVectorRouting ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-}
-
-void
-Ipv4NixVectorRouting::SetIpv4 (Ptr<Ipv4> ipv4)
-{
-  NS_ASSERT (ipv4 != 0);
-  NS_ASSERT (m_ipv4 == 0);
-  NS_LOG_DEBUG ("Created Ipv4NixVectorProtocol");
-
-  m_ipv4 = ipv4;
-}
-
-void 
-Ipv4NixVectorRouting::DoDispose ()
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  m_node = 0;
-  m_ipv4 = 0;
-
-  Ipv4RoutingProtocol::DoDispose ();
-}
-
-
-void
-Ipv4NixVectorRouting::SetNode (Ptr<Node> node)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  m_node = node;
-}
-
-void
-Ipv4NixVectorRouting::FlushGlobalNixRoutingCache (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  NodeList::Iterator listEnd = NodeList::End ();
-  for (NodeList::Iterator i = NodeList::Begin (); i != listEnd; i++)
-    {
-      Ptr<Node> node = *i;
-      Ptr<Ipv4NixVectorRouting> rp = node->GetObject<Ipv4NixVectorRouting> ();
-      if (!rp)
-        {
-          continue;
-        }
-      NS_LOG_LOGIC ("Flushing Nix caches.");
-      rp->FlushNixCache ();
-      rp->FlushIpv4RouteCache ();
-    }
-
-  // IPv4 address to node mapping is potentially invalid so clear it.
-  // Will be repopulated in lazy evaluation when mapping is needed.
-  g_ipv4AddressToNodeMap.clear ();
-}
-
-void
-Ipv4NixVectorRouting::FlushNixCache (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_nixCache.clear ();
-}
-
-void
-Ipv4NixVectorRouting::FlushIpv4RouteCache (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  m_ipv4RouteCache.clear ();
-}
-
-Ptr<NixVector>
-Ipv4NixVectorRouting::GetNixVector (Ptr<Node> source, Ipv4Address dest, Ptr<NetDevice> oif) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  Ptr<NixVector> nixVector = Create<NixVector> ();
-
-  // not in cache, must build the nix vector
-  // First, we have to figure out the nodes 
-  // associated with these IPs
-  Ptr<Node> destNode = GetNodeByIp (dest);
-  if (destNode == 0)
-    {
-      NS_LOG_ERROR ("No routing path exists");
-      return 0;
-    }
-
-  // if source == dest, then we have a special case
-  /// \internal
-  /// Do not process packets to self (see \bugid{1308})
-  if (source == destNode)
-    {
-      NS_LOG_DEBUG ("Do not process packets to self");
-      return 0;
-    }
-  else
-    {
-      // otherwise proceed as normal 
-      // and build the nix vector
-      std::vector< Ptr<Node> > parentVector;
-
-      BFS (NodeList::GetNNodes (), source, destNode, parentVector, oif);
-
-      if (BuildNixVector (parentVector, source->GetId (), destNode->GetId (), nixVector))
-        {
-          return nixVector;
-        }
-      else
-        {
-          NS_LOG_ERROR ("No routing path exists");
-          return 0;
-        }
-    }
-}
-
-Ptr<NixVector>
-Ipv4NixVectorRouting::GetNixVectorInCache (Ipv4Address address) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  CheckCacheStateAndFlush ();
-
-  NixMap_t::iterator iter = m_nixCache.find (address);
-  if (iter != m_nixCache.end ())
-    {
-      NS_LOG_LOGIC ("Found Nix-vector in cache.");
-      return iter->second;
-    }
-
-  // not in cache
-  return 0;
-}
-
-Ptr<Ipv4Route>
-Ipv4NixVectorRouting::GetIpv4RouteInCache (Ipv4Address address)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  CheckCacheStateAndFlush ();
-
-  Ipv4RouteMap_t::iterator iter = m_ipv4RouteCache.find (address);
-  if (iter != m_ipv4RouteCache.end ())
-    {
-      NS_LOG_LOGIC ("Found Ipv4Route in cache.");
-      return iter->second;
-    }
-
-  // not in cache
-  return 0;
-}
-
-bool
-Ipv4NixVectorRouting::BuildNixVectorLocal (Ptr<NixVector> nixVector)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  uint32_t numberOfDevices = m_node->GetNDevices ();
-
-  // here we are building a nix vector to 
-  // ourself, so we need to find the loopback 
-  // interface and add that to the nix vector
-  Ipv4Address loopback ("127.0.0.1");
-  for (uint32_t i = 0; i < numberOfDevices; i++)
-    {
-      uint32_t interfaceIndex = (m_ipv4)->GetInterfaceForDevice (m_node->GetDevice (i));
-      Ipv4InterfaceAddress ifAddr = m_ipv4->GetAddress (interfaceIndex, 0);
-      if (ifAddr.GetLocal () == loopback)
-        {
-          NS_LOG_LOGIC ("Adding loopback to nix.");
-          NS_LOG_LOGIC ("Adding Nix: " << i << " with " << nixVector->BitCount (numberOfDevices) 
-                                       << " bits, for node " << m_node->GetId ());
-          nixVector->AddNeighborIndex (i, nixVector->BitCount (numberOfDevices));
-          return true;
-        }
-    }
-  return false;
-}
-
-bool
-Ipv4NixVectorRouting::BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  if (source == dest)
-    {
-      return true;
-    }
-
-  if (parentVector.at (dest) == 0)
-    {
-      return false;
-    }
-
-  Ptr<Node> parentNode = parentVector.at (dest);
-
-  uint32_t numberOfDevices = parentNode->GetNDevices ();
-  uint32_t destId = 0;
-  uint32_t totalNeighbors = 0;
-
-  // scan through the net devices on the parent node
-  // and then look at the nodes adjacent to them
-  for (uint32_t i = 0; i < numberOfDevices; i++)
-    {
-      // Get a net device from the node
-      // as well as the channel, and figure
-      // out the adjacent net devices
-      Ptr<NetDevice> localNetDevice = parentNode->GetDevice (i);
-      if (localNetDevice->IsBridge ())
-        {
-          continue;
-        }
-      Ptr<Channel> channel = localNetDevice->GetChannel ();
-      if (channel == 0)
-        {
-          continue;
-        }
-
-      // this function takes in the local net dev, and channel, and
-      // writes to the netDeviceContainer the adjacent net devs
-      NetDeviceContainer netDeviceContainer;
-      GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
-
-      // Finally we can get the adjacent nodes
-      // and scan through them.  If we find the 
-      // node that matches "dest" then we can add 
-      // the index  to the nix vector.
-      // the index corresponds to the neighbor index
-      uint32_t offset = 0;
-      for (NetDeviceContainer::Iterator iter = netDeviceContainer.Begin (); iter != netDeviceContainer.End (); iter++)
-        {
-          Ptr<Node> remoteNode = (*iter)->GetNode ();
-
-          if (remoteNode->GetId () == dest)
-            {
-              destId = totalNeighbors + offset;
-            }
-          offset += 1;
-        }
-
-      totalNeighbors += netDeviceContainer.GetN ();
-    }
-  NS_LOG_LOGIC ("Adding Nix: " << destId << " with " 
-                               << nixVector->BitCount (totalNeighbors) << " bits, for node " << parentNode->GetId ());
-  nixVector->AddNeighborIndex (destId, nixVector->BitCount (totalNeighbors));
-
-  // recurse through parent vector, grabbing the path 
-  // and building the nix vector
-  BuildNixVector (parentVector, source, (parentVector.at (dest))->GetId (), nixVector);
-  return true;
-}
-
-void
-Ipv4NixVectorRouting::GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  for (std::size_t i = 0; i < channel->GetNDevices (); i++)
-    {
-      Ptr<NetDevice> remoteDevice = channel->GetDevice (i);
-      if (remoteDevice != netDevice)
-        {
-          Ptr<BridgeNetDevice> bd = NetDeviceIsBridged (remoteDevice);
-          // we have a bridged device, we need to add all 
-          // bridged devices
-          if (bd)
-            {
-              NS_LOG_LOGIC ("Looking through bridge ports of bridge net device " << bd);
-              for (uint32_t j = 0; j < bd->GetNBridgePorts (); ++j)
-                {
-                  Ptr<NetDevice> ndBridged = bd->GetBridgePort (j);
-                  if (ndBridged == remoteDevice)
-                    {
-                      NS_LOG_LOGIC ("That bridge port is me, don't walk backward");
-                      continue;
-                    }
-                  Ptr<Channel> chBridged = ndBridged->GetChannel ();
-                  if (chBridged == 0)
-                    {
-                      continue;
-                    }
-                  GetAdjacentNetDevices (ndBridged, chBridged, netDeviceContainer);
-                }
-            }
-          else
-            {
-              netDeviceContainer.Add (channel->GetDevice (i));
-            }
-        }
-    }
-}
-
-void
-Ipv4NixVectorRouting::BuildIpv4AddressToNodeMap (void) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  for (NodeList::Iterator it = NodeList::Begin (); it != NodeList::End (); ++it)
-    {
-      Ptr<Node> node = *it;
-      Ptr<Ipv4> ipv4 = node->GetObject<Ipv4> ();
-
-      if(ipv4)
-        {
-          uint32_t numberOfDevices = node->GetNDevices ();
-
-          for (uint32_t deviceId = 0; deviceId < numberOfDevices; deviceId++)
-            {
-              Ptr<NetDevice> device = node->GetDevice (deviceId);
-
-              // If this is not a loopback device add the IPv4 address to the map
-              if ( !DynamicCast<LoopbackNetDevice>(device) )
-                {
-                  int32_t interfaceIndex = (ipv4)->GetInterfaceForDevice (node->GetDevice (deviceId));
-                  if (interfaceIndex != -1)
-                    {
-                      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;
-                        }
-                    }
-                }
-            }
-        }
-    }
-}
-
-Ptr<Node>
-Ipv4NixVectorRouting::GetNodeByIp (Ipv4Address dest) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  // Populate lookup table if is empty.
-  if ( g_ipv4AddressToNodeMap.empty () )
-    {
-      BuildIpv4AddressToNodeMap ();
-    }
-
-  Ptr<Node> destNode;
-
-  Ipv4AddressToNodeMap::iterator iter = g_ipv4AddressToNodeMap.find(dest);
-
-  if(iter == g_ipv4AddressToNodeMap.end ())
-    {
-      NS_LOG_ERROR ("Couldn't find dest node given the IP" << dest);
-      destNode = 0;
-    }
-  else
-    {
-      destNode = iter -> second;
-    }
-
-  return destNode;
-}
-
-uint32_t
-Ipv4NixVectorRouting::FindTotalNeighbors (Ptr<Node> node) const
-{
-  uint32_t numberOfDevices = node->GetNDevices ();
-  uint32_t totalNeighbors = 0;
-
-  // scan through the net devices on the parent node
-  // and then look at the nodes adjacent to them
-  for (uint32_t i = 0; i < numberOfDevices; i++)
-    {
-      // Get a net device from the node
-      // as well as the channel, and figure
-      // out the adjacent net devices
-      Ptr<NetDevice> localNetDevice = node->GetDevice (i);
-      Ptr<Channel> channel = localNetDevice->GetChannel ();
-      if (channel == 0)
-        {
-          continue;
-        }
-
-      // this function takes in the local net dev, and channel, and
-      // writes to the netDeviceContainer the adjacent net devs
-      NetDeviceContainer netDeviceContainer;
-      GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
-
-      totalNeighbors += netDeviceContainer.GetN ();
-    }
-
-  return totalNeighbors;
-}
-
-Ptr<BridgeNetDevice>
-Ipv4NixVectorRouting::NetDeviceIsBridged (Ptr<NetDevice> nd) const
-{
-  NS_LOG_FUNCTION (nd);
-
-  Ptr<Node> node = nd->GetNode ();
-  uint32_t nDevices = node->GetNDevices ();
-
-  //
-  // There is no bit on a net device that says it is being bridged, so we have
-  // to look for bridges on the node to which the device is attached.  If we
-  // find a bridge, we need to look through its bridge ports (the devices it
-  // bridges) to see if we find the device in question.
-  //
-  for (uint32_t i = 0; i < nDevices; ++i)
-    {
-      Ptr<NetDevice> ndTest = node->GetDevice (i);
-      NS_LOG_LOGIC ("Examine device " << i << " " << ndTest);
-
-      if (ndTest->IsBridge ())
-        {
-          NS_LOG_LOGIC ("device " << i << " is a bridge net device");
-          Ptr<BridgeNetDevice> bnd = ndTest->GetObject<BridgeNetDevice> ();
-          NS_ABORT_MSG_UNLESS (bnd, "Ipv4NixVectorRouting::NetDeviceIsBridged (): GetObject for <BridgeNetDevice> failed");
-
-          for (uint32_t j = 0; j < bnd->GetNBridgePorts (); ++j)
-            {
-              NS_LOG_LOGIC ("Examine bridge port " << j << " " << bnd->GetBridgePort (j));
-              if (bnd->GetBridgePort (j) == nd)
-                {
-                  NS_LOG_LOGIC ("Net device " << nd << " is bridged by " << bnd);
-                  return bnd;
-                }
-            }
-        }
-    }
-  NS_LOG_LOGIC ("Net device " << nd << " is not bridged");
-  return 0;
-}
-
-uint32_t
-Ipv4NixVectorRouting::FindNetDeviceForNixIndex (Ptr<Node> node, uint32_t nodeIndex, Ipv4Address & gatewayIp) const
-{
-  uint32_t numberOfDevices = node->GetNDevices ();
-  uint32_t index = 0;
-  uint32_t totalNeighbors = 0;
-
-  // scan through the net devices on the parent node
-  // and then look at the nodes adjacent to them
-  for (uint32_t i = 0; i < numberOfDevices; i++)
-    {
-      // Get a net device from the node
-      // as well as the channel, and figure
-      // out the adjacent net devices
-      Ptr<NetDevice> localNetDevice = node->GetDevice (i);
-      Ptr<Channel> channel = localNetDevice->GetChannel ();
-      if (channel == 0)
-        {
-          continue;
-        }
-
-      // this function takes in the local net dev, and channel, and
-      // writes to the netDeviceContainer the adjacent net devs
-      NetDeviceContainer netDeviceContainer;
-      GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
-
-      // check how many neighbors we have
-      if (nodeIndex < (totalNeighbors + netDeviceContainer.GetN ()))
-        {
-          // found the proper net device
-          index = i;
-          Ptr<NetDevice> gatewayDevice = netDeviceContainer.Get (nodeIndex-totalNeighbors);
-          Ptr<Node> gatewayNode = gatewayDevice->GetNode ();
-          Ptr<Ipv4> ipv4 = gatewayNode->GetObject<Ipv4> ();
-
-          uint32_t interfaceIndex = (ipv4)->GetInterfaceForDevice (gatewayDevice);
-          Ipv4InterfaceAddress ifAddr = ipv4->GetAddress (interfaceIndex, 0);
-          gatewayIp = ifAddr.GetLocal ();
-          break;
-        }
-      totalNeighbors += netDeviceContainer.GetN ();
-    }
-
-  return index;
-}
-
-Ptr<Ipv4Route> 
-Ipv4NixVectorRouting::RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-  Ptr<Ipv4Route> rtentry;
-  Ptr<NixVector> nixVectorInCache;
-  Ptr<NixVector> nixVectorForPacket;
-
-  CheckCacheStateAndFlush ();
-
-  NS_LOG_DEBUG ("Dest IP from header: " << header.GetDestination ());
-  // check if cache
-  nixVectorInCache = GetNixVectorInCache (header.GetDestination ());
-
-  // not in cache
-  if (!nixVectorInCache)
-    {
-      NS_LOG_LOGIC ("Nix-vector not in cache, build: ");
-      // Build the nix-vector, given this node and the
-      // dest IP address
-      nixVectorInCache = GetNixVector (m_node, header.GetDestination (), oif);
-
-      // cache it
-      m_nixCache.insert (NixMap_t::value_type (header.GetDestination (), nixVectorInCache));
-    }
-
-  // path exists
-  if (nixVectorInCache)
-    {
-      NS_LOG_LOGIC ("Nix-vector contents: " << *nixVectorInCache);
-
-      // create a new nix vector to be used, 
-      // we want to keep the cached version clean
-      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_node);
-        }
-
-      // Get the interface number that we go out of, by extracting
-      // from the nix-vector
-      uint32_t numberOfBits = nixVectorForPacket->BitCount (m_totalNeighbors);
-      uint32_t nodeIndex = nixVectorForPacket->ExtractNeighborIndex (numberOfBits);
-
-      // Search here in a cache for this node index 
-      // and look for a Ipv4Route
-      rtentry = GetIpv4RouteInCache (header.GetDestination ());
-
-      if (!rtentry || !(rtentry->GetOutputDevice () == oif))
-        {
-          // not in cache or a different specified output
-          // device is to be used
-
-          // first, make sure we erase existing (incorrect)
-          // rtentry from the map
-          if (rtentry)
-            {
-              m_ipv4RouteCache.erase (header.GetDestination ());
-            }
-
-          NS_LOG_LOGIC ("Ipv4Route not in cache, build: ");
-          Ipv4Address gatewayIp;
-          uint32_t index = FindNetDeviceForNixIndex (m_node, nodeIndex, gatewayIp);
-          int32_t interfaceIndex = 0;
-
-          if (!oif)
-            {
-              interfaceIndex = (m_ipv4)->GetInterfaceForDevice (m_node->GetDevice (index));
-            }
-          else
-            {
-              interfaceIndex = (m_ipv4)->GetInterfaceForDevice (oif);
-            }
-
-          NS_ASSERT_MSG (interfaceIndex != -1, "Interface index not found for device");
-
-          Ipv4Address sourceIPAddr = m_ipv4->SourceAddressSelection (interfaceIndex, header.GetDestination ());
-
-          // start filling in the Ipv4Route info
-          rtentry = Create<Ipv4Route> ();
-          rtentry->SetSource (sourceIPAddr);
-
-          rtentry->SetGateway (gatewayIp);
-          rtentry->SetDestination (header.GetDestination ());
-
-          if (!oif)
-            {
-              rtentry->SetOutputDevice (m_ipv4->GetNetDevice (interfaceIndex));
-            }
-          else
-            {
-              rtentry->SetOutputDevice (oif);
-            }
-
-          sockerr = Socket::ERROR_NOTERROR;
-
-          // add rtentry to cache
-          m_ipv4RouteCache.insert (Ipv4RouteMap_t::value_type (header.GetDestination (), rtentry));
-        }
-
-      NS_LOG_LOGIC ("Nix-vector contents: " << *nixVectorInCache << " : Remaining bits: " << nixVectorForPacket->GetRemainingBits ());
-
-      // Add  nix-vector in the packet class 
-      // make sure the packet exists first
-      if (p)
-        {
-          NS_LOG_LOGIC ("Adding Nix-vector to packet: " << *nixVectorForPacket);
-          p->SetNixVector (nixVectorForPacket);
-        }
-    }
-  else // path doesn't exist
-    {
-      NS_LOG_ERROR ("No path to the dest: " << header.GetDestination ());
-      sockerr = Socket::ERROR_NOROUTETOHOST;
-    }
-
-  return rtentry;
-}
-
-bool 
-Ipv4NixVectorRouting::RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
-                                  UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-                                  LocalDeliverCallback lcb, ErrorCallback ecb)
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  CheckCacheStateAndFlush ();
-
-  NS_ASSERT (m_ipv4 != 0);
-  // Check if input device supports IP
-  NS_ASSERT (m_ipv4->GetInterfaceForDevice (idev) >= 0);
-  uint32_t iif = m_ipv4->GetInterfaceForDevice (idev);
-
-  // Local delivery
-  if (m_ipv4->IsDestinationAddress (header.GetDestination (), iif))
-    {
-      if (!lcb.IsNull ())
-        {
-          NS_LOG_LOGIC ("Local delivery to " << header.GetDestination ());
-          lcb (p, header, iif);
-          return true;
-        }
-      else
-        {
-          // The local delivery callback is null.  This may be a multicast
-          // or broadcast packet, so return false so that another
-          // multicast routing protocol can handle it.  It should be possible
-          // to extend this to explicitly check whether it is a unicast
-          // packet, and invoke the error callback if so
-          return false;
-        }
-    }
-
-  Ptr<Ipv4Route> rtentry;
-
-  // Get the nix-vector from the packet
-  Ptr<NixVector> nixVector = p->GetNixVector ();
-
-  // If nixVector isn't in packet, something went wrong
-  NS_ASSERT (nixVector);
-
-  // Get the interface number that we go out of, by extracting
-  // from the nix-vector
-  if (m_totalNeighbors == 0)
-    {
-      m_totalNeighbors = FindTotalNeighbors (m_node);
-    }
-  uint32_t numberOfBits = nixVector->BitCount (m_totalNeighbors);
-  uint32_t nodeIndex = nixVector->ExtractNeighborIndex (numberOfBits);
-
-  rtentry = GetIpv4RouteInCache (header.GetDestination ());
-  // not in cache
-  if (!rtentry)
-    {
-      NS_LOG_LOGIC ("Ipv4Route not in cache, build: ");
-      Ipv4Address 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);
-
-      // start filling in the Ipv4Route info
-      rtentry = Create<Ipv4Route> ();
-      rtentry->SetSource (ifAddr.GetLocal ());
-
-      rtentry->SetGateway (gatewayIp);
-      rtentry->SetDestination (header.GetDestination ());
-      rtentry->SetOutputDevice (m_ipv4->GetNetDevice (interfaceIndex));
-
-      // add rtentry to cache
-      m_ipv4RouteCache.insert (Ipv4RouteMap_t::value_type (header.GetDestination (), rtentry));
-    }
-
-  NS_LOG_LOGIC ("At Node " << m_node->GetId () << ", Extracting " << numberOfBits <<
-                " bits from Nix-vector: " << nixVector << " : " << *nixVector);
-
-  // call the unicast callback
-  // local deliver is handled by Ipv4StaticRoutingImpl
-  // so this code is never even called if the packet is
-  // destined for this node.
-  ucb (rtentry, p, header);
-
-  return true;
-}
-
-void
-Ipv4NixVectorRouting::PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
-{
-
-  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: " << m_ipv4->GetObject<Node> ()->GetLocalTime ().As (unit)
-      << ", Nix Routing" << std::endl;
-
-  *os << "NixCache:" << std::endl;
-  if (m_nixCache.size () > 0)
-    {
-      *os << "Destination     NixVector" << std::endl;
-      for (NixMap_t::const_iterator it = m_nixCache.begin (); it != m_nixCache.end (); it++)
-        {
-          std::ostringstream dest;
-          dest << it->first;
-          *os << std::setw (16) << dest.str ();
-          *os << *(it->second) << std::endl;
-        }
-    }
-  *os << "Ipv4RouteCache:" << std::endl;
-  if (m_ipv4RouteCache.size () > 0)
-    {
-      *os << "Destination     Gateway         Source            OutputDevice" << std::endl;
-      for (Ipv4RouteMap_t::const_iterator it = m_ipv4RouteCache.begin (); it != m_ipv4RouteCache.end (); it++)
-        {
-          std::ostringstream dest, gw, src;
-          dest << it->second->GetDestination ();
-          *os << std::setw (16) << dest.str ();
-          gw << it->second->GetGateway ();
-          *os << std::setw (16) << gw.str ();
-          src << it->second->GetSource ();
-          *os << std::setw (16) << src.str ();
-          *os << "  ";
-          if (Names::FindName (it->second->GetOutputDevice ()) != "")
-            {
-              *os << Names::FindName (it->second->GetOutputDevice ());
-            }
-          else
-            {
-              *os << it->second->GetOutputDevice ()->GetIfIndex ();
-            }
-          *os << std::endl;
-        }
-    }
-  *os << std::endl;
-  // Restore the previous ostream state
-  (*os).copyfmt (oldState);
-}
-
-// virtual functions from Ipv4RoutingProtocol 
-void
-Ipv4NixVectorRouting::NotifyInterfaceUp (uint32_t i)
-{
-  g_isCacheDirty = true;
-}
-void
-Ipv4NixVectorRouting::NotifyInterfaceDown (uint32_t i)
-{
-  g_isCacheDirty = true;
-}
-void
-Ipv4NixVectorRouting::NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address)
-{
-  g_isCacheDirty = true;
-}
-void
-Ipv4NixVectorRouting::NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address)
-{
-  g_isCacheDirty = true;
-}
-
-bool
-Ipv4NixVectorRouting::BFS (uint32_t numberOfNodes, Ptr<Node> source, 
-                           Ptr<Node> dest, std::vector< Ptr<Node> > & parentVector,
-                           Ptr<NetDevice> oif) const
-{
-  NS_LOG_FUNCTION_NOARGS ();
-
-  NS_LOG_LOGIC ("Going from Node " << source->GetId () << " to Node " << dest->GetId ());
-  std::queue< Ptr<Node> > greyNodeList;  // discovered nodes with unexplored children
-
-  // reset the parent vector
-  parentVector.assign (numberOfNodes, 0); // initialize to 0
-
-  // Add the source node to the queue, set its parent to itself 
-  greyNodeList.push (source);
-  parentVector.at (source->GetId ()) = source;
-
-  // BFS loop
-  while (greyNodeList.size () != 0)
-    {
-      Ptr<Node> currNode = greyNodeList.front ();
-      Ptr<Ipv4> ipv4 = currNode->GetObject<Ipv4> ();
- 
-      if (currNode == dest) 
-        {
-          NS_LOG_LOGIC ("Made it to Node " << currNode->GetId ());
-          return true;
-        }
-
-      // if this is the first iteration of the loop and a 
-      // specific output interface was given, make sure 
-      // we go this way
-      if (currNode == source && oif)
-        {
-          // make sure that we can go this way
-          if (ipv4)
-            {
-              uint32_t interfaceIndex = (ipv4)->GetInterfaceForDevice (oif);
-              if (!(ipv4->IsUp (interfaceIndex)))
-                {
-                  NS_LOG_LOGIC ("Ipv4Interface is down");
-                  return false;
-                }
-            }
-          if (!(oif->IsLinkUp ()))
-            {
-              NS_LOG_LOGIC ("Link is down.");
-              return false;
-            }
-          Ptr<Channel> channel = oif->GetChannel ();
-          if (channel == 0)
-            { 
-              return false;
-            }
-
-          // this function takes in the local net dev, and channel, and
-          // writes to the netDeviceContainer the adjacent net devs
-          NetDeviceContainer netDeviceContainer;
-          GetAdjacentNetDevices (oif, channel, netDeviceContainer);
-
-          // Finally we can get the adjacent nodes
-          // and scan through them.  We push them
-          // to the greyNode queue, if they aren't 
-          // already there.
-          for (NetDeviceContainer::Iterator iter = netDeviceContainer.Begin (); iter != netDeviceContainer.End (); iter++)
-            {
-              Ptr<Node> remoteNode = (*iter)->GetNode ();
-
-              // check to see if this node has been pushed before
-              // by checking to see if it has a parent
-              // if it doesn't (null or 0), then set its parent and 
-              // push to the queue
-              if (parentVector.at (remoteNode->GetId ()) == 0)
-                {
-                  parentVector.at (remoteNode->GetId ()) = currNode;
-                  greyNodeList.push (remoteNode);
-                }
-            }
-        }
-      else
-        {
-          // Iterate over the current node's adjacent vertices
-          // and push them into the queue
-          for (uint32_t i = 0; i < (currNode->GetNDevices ()); i++)
-            {
-              // Get a net device from the node
-              // as well as the channel, and figure
-              // out the adjacent net device
-              Ptr<NetDevice> localNetDevice = currNode->GetDevice (i);
-
-              // make sure that we can go this way
-              if (ipv4)
-                {
-                  uint32_t interfaceIndex = (ipv4)->GetInterfaceForDevice (currNode->GetDevice (i));
-                  if (!(ipv4->IsUp (interfaceIndex)))
-                    {
-                      NS_LOG_LOGIC ("Ipv4Interface is down");
-                      continue;
-                    }
-                }
-              if (!(localNetDevice->IsLinkUp ()))
-                {
-                  NS_LOG_LOGIC ("Link is down.");
-                  continue;
-                }
-              Ptr<Channel> channel = localNetDevice->GetChannel ();
-              if (channel == 0)
-                { 
-                  continue;
-                }
-
-              // this function takes in the local net dev, and channel, and
-              // writes to the netDeviceContainer the adjacent net devs
-              NetDeviceContainer netDeviceContainer;
-              GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
-
-              // Finally we can get the adjacent nodes
-              // and scan through them.  We push them
-              // to the greyNode queue, if they aren't 
-              // already there.
-              for (NetDeviceContainer::Iterator iter = netDeviceContainer.Begin (); iter != netDeviceContainer.End (); iter++)
-                {
-                  Ptr<Node> remoteNode = (*iter)->GetNode ();
-
-                  // check to see if this node has been pushed before
-                  // by checking to see if it has a parent
-                  // if it doesn't (null or 0), then set its parent and 
-                  // push to the queue
-                  if (parentVector.at (remoteNode->GetId ()) == 0)
-                    {
-                      parentVector.at (remoteNode->GetId ()) = currNode;
-                      greyNodeList.push (remoteNode);
-                    }
-                }
-            }
-        }
-
-      // Pop off the head grey node.  We have all its children.
-      // It is now black.
-      greyNodeList.pop ();
-    }
-
-  // Didn't find the dest...
-  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
-{
-  if (g_isCacheDirty)
-    {
-      FlushGlobalNixRoutingCache ();
-      g_isCacheDirty = false;
-    }
-}
-
-} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.h ns-3.35/src/nix-vector-routing/model/ipv4-nix-vector-routing.h
--- ns-3.34/src/nix-vector-routing/model/ipv4-nix-vector-routing.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/model/ipv4-nix-vector-routing.h	2021-10-01 13:26:47.000000000 -0700
@@ -1,6 +1,6 @@
 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2009 The Georgia Institute of Technology 
+ * 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
@@ -15,266 +15,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
- * Authors: Josh Pelkey <jpelkey@gatech.edu>
- */
-
-#ifndef IPV4_NIX_VECTOR_ROUTING_H
-#define IPV4_NIX_VECTOR_ROUTING_H
-
-#include "ns3/channel.h"
-#include "ns3/node-container.h"
-#include "ns3/node-list.h"
-#include "ns3/net-device-container.h"
-#include "ns3/ipv4-routing-protocol.h"
-#include "ns3/ipv4-route.h"
-#include "ns3/nix-vector.h"
-#include "ns3/bridge-net-device.h"
-#include "ns3/nstime.h"
-
-#include <map>
-#include <unordered_map>
-
-namespace ns3 {
-
-/**
- * \defgroup nix-vector-routing Nix-Vector Routing
+ * The purpose of this file is to have backwards compatibility with previous
+ * IPv4 Nix Vector Routing examples and usages.
  *
- * Nix-vector routing is a simulation specific routing protocol and is
- * intended for large network topologies.
- */
-
-/**
- * \ingroup nix-vector-routing
- * Map of Ipv4Address to NixVector
- */
-typedef std::map<Ipv4Address, Ptr<NixVector> > NixMap_t;
-/**
- * \ingroup nix-vector-routing
- * Map of Ipv4Address to Ipv4Route
- */
-typedef std::map<Ipv4Address, Ptr<Ipv4Route> > Ipv4RouteMap_t;
-
-/**
- * \ingroup nix-vector-routing
- * Nix-vector routing protocol
+ * Authors: Ameya Deshpande <ameyanrd@outlook.com>
  */
-class Ipv4NixVectorRouting : public Ipv4RoutingProtocol
-{
-public:
-  Ipv4NixVectorRouting ();
-  ~Ipv4NixVectorRouting ();
-  /**
-   * @brief The Interface ID of the Global Router interface.
-   * @return The Interface ID
-   * @see Object::GetObject ()
-   */
-  static TypeId GetTypeId (void);
-  /**
-   * @brief Set the Node pointer of the node for which this
-   * routing protocol is to be placed
-   *
-   * @param node Node pointer
-   */
-  void SetNode (Ptr<Node> node);
-
-  /**
-   * @brief Called when run-time link topology change occurs
-   * which iterates through the node list and flushes any
-   * nix vector caches
-   *
-   * \internal
-   * \c const is used here due to need to potentially flush the cache
-   * in const methods such as PrintRoutingTable.  Caches are stored in
-   * mutable variables and flushed in const methods.
-   */
-  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:
-
-  /**
-   * Flushes the cache which stores nix-vector based on
-   * destination IP
-   */
-  void FlushNixCache (void) const;
-
-  /**
-   * Flushes the cache which stores the Ipv4 route
-   * based on the destination IP
-   */
-  void FlushIpv4RouteCache (void) const;
-
-  /**
-   * Upon a run-time topology change caches are
-   * flushed and the total number of neighbors is
-   * reset to zero
-   */
-  void ResetTotalNeighbors (void);
-
-  /**
-   * Takes in the source node and dest IP and calls GetNodeByIp,
-   * BFS, accounting for any output interface specified, and finally
-   * BuildNixVector to return the built nix-vector
-   *
-   * \param source Source node
-   * \param dest Destination node address
-   * \param oif Preferred output interface
-   * \returns The NixVector to be used in routing.
-   */
-  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) const;
-
-  /**
-   * Checks the cache based on dest IP for the Ipv4Route
-   * \param address Address to check
-   * \returns The cached route.
-   */
-  Ptr<Ipv4Route> GetIpv4RouteInCache (Ipv4Address address);
-
-  /**
-   * Given a net-device returns all the adjacent net-devices,
-   * essentially getting the neighbors on that channel
-   * \param [in] netDevice the NetDevice attached to the channel.
-   * \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) const;
-
-  /**
-   * Iterates through the node list and finds the one
-   * corresponding to the given Ipv4Address
-   * \param dest destination node IP
-   * \return The node with the specified IP.
-   */
-  Ptr<Node> GetNodeByIp (Ipv4Address dest) const;
-
-  /**
-   * Recurses the parent vector, created by BFS and actually builds the nixvector
-   * \param [in] parentVector Parent vector for retracing routes
-   * \param [in] source Source Node index
-   * \param [in] dest Destination Node index
-   * \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) const;
-
-  /**
-   * Special variation of BuildNixVector for when a node is sending to itself
-   * \param [out] nixVector the NixVector to be used for routing
-   * \returns true on success, false otherwise.
-   */
-  bool BuildNixVectorLocal (Ptr<NixVector> nixVector);
-
-  /**
-   * 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 (Ptr<Node> node) const;
-
-
-  /**
-   * Determine if the NetDevice is bridged
-   * \param nd the NetDevice to check
-   * \returns the bridging NetDevice (or null if the NetDevice is not bridged)
-   */
-  Ptr<BridgeNetDevice> NetDeviceIsBridged (Ptr<NetDevice> nd) const;
-
-
-  /**
-   * 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 (Ptr<Node> node, uint32_t nodeIndex, Ipv4Address & gatewayIp) const;
-
-  /**
-   * \brief Breadth first search algorithm.
-   * \param [in] numberOfNodes total number of nodes
-   * \param [in] source Source Node
-   * \param [in] dest Destination Node
-   * \param [out] parentVector Parent vector for retracing routes
-   * \param [in] oif specific output interface to use from source node, if not null
-   * \returns false if dest not found, true o.w.
-   */
-  bool BFS (uint32_t numberOfNodes,
-            Ptr<Node> source,
-            Ptr<Node> dest,
-            std::vector< Ptr<Node> > & parentVector,
-            Ptr<NetDevice> oif) const;
-
-  void DoDispose (void);
-
-  /* From Ipv4RoutingProtocol */
-  virtual Ptr<Ipv4Route> RouteOutput (Ptr<Packet> p, const Ipv4Header &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr);
-  virtual bool RouteInput (Ptr<const Packet> p, const Ipv4Header &header, Ptr<const NetDevice> idev,
-                           UnicastForwardCallback ucb, MulticastForwardCallback mcb,
-                           LocalDeliverCallback lcb, ErrorCallback ecb);
-  virtual void NotifyInterfaceUp (uint32_t interface);
-  virtual void NotifyInterfaceDown (uint32_t interface);
-  virtual void NotifyAddAddress (uint32_t interface, Ipv4InterfaceAddress address);
-  virtual void NotifyRemoveAddress (uint32_t interface, Ipv4InterfaceAddress address);
-  virtual void SetIpv4 (Ptr<Ipv4> ipv4);
-  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
- 
-  /**
-   * Flushes routing caches if required.
-   */
-  void CheckCacheStateAndFlush (void) const;
-
-  /**
-   * Build map from IPv4 Address to Node for faster lookup.
-   */
-  void BuildIpv4AddressToNodeMap (void) const;
-
-  /**
-   * Flag to mark when caches are dirty and need to be flushed.  
-   * Used for lazy cleanup of caches when there are many topology changes.
-   */
-  static bool g_isCacheDirty;
-
-  /** Cache stores nix-vectors based on destination ip */
-  mutable NixMap_t m_nixCache;
-
-  /** Cache stores Ipv4Routes based on destination ip */
-  mutable Ipv4RouteMap_t m_ipv4RouteCache;
-
-  Ptr<Ipv4> m_ipv4; //!< IPv4 object
-  Ptr<Node> m_node; //!< Node object
-
-  /** Total neighbors used for nix-vector to determine number of bits */
-  uint32_t m_totalNeighbors;
-
-
-  /**
-   * Mapping of IPv4 address to ns-3 node.
-   *
-   * Used to avoid linear searching of nodes/devices to find a node in
-   * GetNodeByIp() method.  NIX vector routing assumes IP addresses
-   * are unique so mapping can be done without duplication.
-   **/
-  typedef std::unordered_map<Ipv4Address, ns3::Ptr<ns3::Node>, Ipv4AddressHash > Ipv4AddressToNodeMap;
-  static Ipv4AddressToNodeMap g_ipv4AddressToNodeMap; //!< Address to node map.
-};
-} // namespace ns3
-
-#endif /* IPV4_NIX_VECTOR_ROUTING_H */
+#pragma GCC warning "NS_DEPRECATED_3_35 - Deprecated header, please use nix-vector-routing.h instead"
+#include "nix-vector-routing.h"
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/model/nix-vector-routing.cc ns-3.35/src/nix-vector-routing/model/nix-vector-routing.cc
--- ns-3.34/src/nix-vector-routing/model/nix-vector-routing.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/nix-vector-routing/model/nix-vector-routing.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,1377 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 The Georgia Institute of Technology
+ * 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
+ * 
+ * This file is adapted from the old ipv4-nix-vector-routing.cc.
+ *
+ * Authors: Josh Pelkey <jpelkey@gatech.edu>
+ * 
+ * Modified by: Ameya Deshpande <ameyanrd@outlook.com>
+ */
+
+#include <queue>
+#include <iomanip>
+
+#include "ns3/log.h"
+#include "ns3/abort.h"
+#include "ns3/names.h"
+#include "ns3/ipv4-list-routing.h"
+#include "ns3/loopback-net-device.h"
+
+#include "nix-vector-routing.h"
+
+namespace ns3 {
+
+NS_LOG_COMPONENT_DEFINE ("NixVectorRouting");
+
+NS_OBJECT_TEMPLATE_CLASS_DEFINE (NixVectorRouting, Ipv4RoutingProtocol);
+NS_OBJECT_TEMPLATE_CLASS_DEFINE (NixVectorRouting, Ipv6RoutingProtocol);
+
+template <typename T>
+bool NixVectorRouting<T>::g_isCacheDirty = false;
+
+template <typename T>
+typename NixVectorRouting<T>::IpAddressToNodeMap NixVectorRouting<T>::g_ipAddressToNodeMap;
+
+template <typename T>
+typename NixVectorRouting<T>::NetDeviceToIpInterfaceMap NixVectorRouting<T>::g_netdeviceToIpInterfaceMap;
+
+template <typename T>
+TypeId 
+NixVectorRouting<T>::GetTypeId (void)
+{
+  std::string Tname = GetTypeParamName<NixVectorRouting<T> > ();
+  std::string name = (Tname == "Ipv4RoutingProtocol" ? "Ipv4" : "Ipv6");
+  static TypeId tid = TypeId (("ns3::" + name + "NixVectorRouting").c_str ())
+    .SetParent<T> ()
+    .SetGroupName ("NixVectorRouting")
+    .template AddConstructor<NixVectorRouting<T> > ()
+  ;
+  return tid;
+}
+
+template <typename T>
+NixVectorRouting<T>::NixVectorRouting ()
+  : m_totalNeighbors (0)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+template <typename T>
+NixVectorRouting<T>::~NixVectorRouting ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::SetIpv4 (Ptr<Ip> ipv4)
+{
+  NS_ASSERT (ipv4 != 0);
+  NS_ASSERT (m_ip == 0);
+  NS_LOG_DEBUG ("Created Ipv4NixVectorProtocol");
+
+  m_ip = ipv4;
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::SetIpv6 (Ptr<Ip> ipv6)
+{
+  NS_ASSERT (ipv6 != 0);
+  NS_ASSERT (m_ip == 0);
+  NS_LOG_DEBUG ("Created Ipv6NixVectorProtocol");
+
+  m_ip = ipv6;
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::DoInitialize ()
+{
+  NS_LOG_FUNCTION (this);
+
+  for (uint32_t i = 0 ; i < m_ip->GetNInterfaces (); i++)
+    {
+      m_ip->SetForwarding (i, true);
+    }
+
+  T::DoInitialize ();
+}
+
+template <typename T>
+void 
+NixVectorRouting<T>::DoDispose ()
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  m_node = 0;
+  m_ip = 0;
+
+  T::DoDispose ();
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::SetNode (Ptr<Node> node)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  m_node = node;
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::FlushGlobalNixRoutingCache (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  NodeList::Iterator listEnd = NodeList::End ();
+  for (NodeList::Iterator i = NodeList::Begin (); i != listEnd; i++)
+    {
+      Ptr<Node> node = *i;
+      Ptr<NixVectorRouting<T> > rp = node->GetObject<NixVectorRouting> ();
+      if (!rp)
+        {
+          continue;
+        }
+      NS_LOG_LOGIC ("Flushing Nix caches.");
+      rp->FlushNixCache ();
+      rp->FlushIpRouteCache ();
+      rp->m_totalNeighbors = 0;
+    }
+
+  // IP address to node mapping is potentially invalid so clear it.
+  // Will be repopulated in lazy evaluation when mapping is needed.
+  g_ipAddressToNodeMap.clear ();
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::FlushNixCache (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  m_nixCache.clear ();
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::FlushIpRouteCache (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+  m_ipRouteCache.clear ();
+}
+
+template <typename T>
+Ptr<NixVector>
+NixVectorRouting<T>::GetNixVector (Ptr<Node> source, IpAddress dest, Ptr<NetDevice> oif) const
+{
+  NS_LOG_FUNCTION (this << source << dest << oif);
+
+  Ptr<NixVector> nixVector = Create<NixVector> ();
+
+  // not in cache, must build the nix vector
+  // First, we have to figure out the nodes 
+  // associated with these IPs
+  Ptr<Node> destNode = GetNodeByIp (dest);
+  if (destNode == 0)
+    {
+      NS_LOG_ERROR ("No routing path exists");
+      return 0;
+    }
+
+  // if source == dest, then we have a special case
+  /// \internal
+  /// Do not process packets to self (see \bugid{1308})
+  if (source == destNode)
+    {
+      NS_LOG_DEBUG ("Do not process packets to self");
+      return 0;
+    }
+  else
+    {
+      // otherwise proceed as normal 
+      // and build the nix vector
+      std::vector< Ptr<Node> > parentVector;
+
+      if (BFS (NodeList::GetNNodes (), source, destNode, parentVector, oif))
+        {
+          if (BuildNixVector (parentVector, source->GetId (), destNode->GetId (), nixVector))
+            {
+              return nixVector;
+            }
+          else
+            {
+              NS_LOG_ERROR ("No routing path exists");
+              return 0;
+            }
+        }
+      else
+        {
+          NS_LOG_ERROR ("No routing path exists");
+          return 0;
+        }
+
+    }
+}
+
+template <typename T>
+Ptr<NixVector>
+NixVectorRouting<T>::GetNixVectorInCache (const IpAddress &address, bool &foundInCache) const
+{
+  NS_LOG_FUNCTION (this << address);
+
+  CheckCacheStateAndFlush ();
+
+  typename NixMap_t::iterator iter = m_nixCache.find (address);
+  if (iter != m_nixCache.end ())
+    {
+      NS_LOG_LOGIC ("Found Nix-vector in cache.");
+      foundInCache = true;
+      return iter->second;
+    }
+
+  // not in cache
+  foundInCache = false;
+  return 0;
+}
+
+template <typename T>
+Ptr<typename NixVectorRouting<T>::IpRoute>
+NixVectorRouting<T>::GetIpRouteInCache (IpAddress address)
+{
+  NS_LOG_FUNCTION (this << address);
+
+  CheckCacheStateAndFlush ();
+
+  typename IpRouteMap_t::iterator iter = m_ipRouteCache.find (address);
+  if (iter != m_ipRouteCache.end ())
+    {
+      NS_LOG_LOGIC ("Found IpRoute in cache.");
+      return iter->second;
+    }
+
+  // not in cache
+  return 0;
+}
+
+template <typename T>
+bool
+NixVectorRouting<T>::BuildNixVectorLocal (Ptr<NixVector> nixVector)
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  uint32_t numberOfDevices = m_node->GetNDevices ();
+
+  // here we are building a nix vector to 
+  // ourself, so we need to find the loopback 
+  // interface and add that to the nix vector
+
+  for (uint32_t i = 0; i < numberOfDevices; i++)
+    {
+      uint32_t interfaceIndex = (m_ip)->GetInterfaceForDevice (m_node->GetDevice (i));
+      IpInterfaceAddress ifAddr = m_ip->GetAddress (interfaceIndex, 0);
+      IpAddress ifAddrValue = ifAddr.GetAddress ();
+      if (ifAddrValue.IsLocalhost ())
+        {
+          NS_LOG_LOGIC ("Adding loopback to nix.");
+          NS_LOG_LOGIC ("Adding Nix: " << i << " with " << nixVector->BitCount (numberOfDevices) 
+                                       << " bits, for node " << m_node->GetId ());
+          nixVector->AddNeighborIndex (i, nixVector->BitCount (numberOfDevices));
+          return true;
+        }
+    }
+  return false;
+}
+
+template <typename T>
+bool
+NixVectorRouting<T>::BuildNixVector (const std::vector< Ptr<Node> > & parentVector, uint32_t source, uint32_t dest, Ptr<NixVector> nixVector) const
+{
+  NS_LOG_FUNCTION (this << parentVector << source << dest << nixVector);
+
+  if (source == dest)
+    {
+      return true;
+    }
+
+  if (parentVector.at (dest) == 0)
+    {
+      return false;
+    }
+
+  Ptr<Node> parentNode = parentVector.at (dest);
+
+  uint32_t numberOfDevices = parentNode->GetNDevices ();
+  uint32_t destId = 0;
+  uint32_t totalNeighbors = 0;
+
+  // scan through the net devices on the T node
+  // and then look at the nodes adjacent to them
+  for (uint32_t i = 0; i < numberOfDevices; i++)
+    {
+      // Get a net device from the node
+      // as well as the channel, and figure
+      // out the adjacent net devices
+      Ptr<NetDevice> localNetDevice = parentNode->GetDevice (i);
+      if (localNetDevice->IsBridge ())
+        {
+          continue;
+        }
+      Ptr<Channel> channel = localNetDevice->GetChannel ();
+      if (channel == 0)
+        {
+          continue;
+        }
+
+      // this function takes in the local net dev, and channel, and
+      // writes to the netDeviceContainer the adjacent net devs
+      NetDeviceContainer netDeviceContainer;
+      GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
+
+      // Finally we can get the adjacent nodes
+      // and scan through them.  If we find the 
+      // node that matches "dest" then we can add 
+      // the index  to the nix vector.
+      // the index corresponds to the neighbor index
+      uint32_t offset = 0;
+      for (NetDeviceContainer::Iterator iter = netDeviceContainer.Begin (); iter != netDeviceContainer.End (); iter++)
+        {
+          Ptr<Node> remoteNode = (*iter)->GetNode ();
+
+          if (remoteNode->GetId () == dest)
+            {
+              destId = totalNeighbors + offset;
+            }
+          offset += 1;
+        }
+
+      totalNeighbors += netDeviceContainer.GetN ();
+    }
+  NS_LOG_LOGIC ("Adding Nix: " << destId << " with " 
+                               << nixVector->BitCount (totalNeighbors) << " bits, for node " << parentNode->GetId ());
+  nixVector->AddNeighborIndex (destId, nixVector->BitCount (totalNeighbors));
+
+  // recurse through T vector, grabbing the path
+  // and building the nix vector
+  BuildNixVector (parentVector, source, (parentVector.at (dest))->GetId (), nixVector);
+  return true;
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::GetAdjacentNetDevices (Ptr<NetDevice> netDevice, Ptr<Channel> channel, NetDeviceContainer & netDeviceContainer) const
+{
+  NS_LOG_FUNCTION (this << netDevice << channel);
+
+  Ptr<IpInterface> netDeviceInterface = GetInterfaceByNetDevice (netDevice);
+  if (netDeviceInterface == 0 || !netDeviceInterface->IsUp ())
+    {
+      NS_LOG_LOGIC ("IpInterface either doesn't exist or is down");
+      return;
+    }
+
+  uint32_t netDeviceAddresses = netDeviceInterface->GetNAddresses ();
+
+  for (std::size_t i = 0; i < channel->GetNDevices (); i++)
+    {
+      Ptr<NetDevice> remoteDevice = channel->GetDevice (i);
+      if (remoteDevice != netDevice)
+        {
+          // Compare if the remoteDevice shares a common subnet with remoteDevice
+          Ptr<IpInterface> remoteDeviceInterface = GetInterfaceByNetDevice (remoteDevice);
+          if (remoteDeviceInterface == 0 || !remoteDeviceInterface->IsUp ())
+            {
+              NS_LOG_LOGIC ("IpInterface either doesn't exist or is down");
+              continue;
+            }
+
+          uint32_t remoteDeviceAddresses = remoteDeviceInterface->GetNAddresses ();
+          bool commonSubnetFound = false;
+
+          for (uint32_t j = 0; j < netDeviceAddresses; ++j)
+            {
+              IpInterfaceAddress netDeviceIfAddr = netDeviceInterface->GetAddress (j);
+              if constexpr (!IsIpv4::value)
+                {
+                  if (netDeviceIfAddr.GetScope () == Ipv6InterfaceAddress::LINKLOCAL)
+                    {
+                      continue;
+                    }
+                }
+              for (uint32_t k = 0; k < remoteDeviceAddresses; ++k)
+                {
+                  IpInterfaceAddress remoteDeviceIfAddr = remoteDeviceInterface->GetAddress (k);
+                  if constexpr (!IsIpv4::value)
+                    {
+                      if (remoteDeviceIfAddr.GetScope () == Ipv6InterfaceAddress::LINKLOCAL)
+                        {
+                          continue;
+                        }
+                    }
+                  if (netDeviceIfAddr.IsInSameSubnet (remoteDeviceIfAddr.GetAddress ()))
+                    {
+                      commonSubnetFound = true;
+                      break;
+                    }
+                }
+
+              if (commonSubnetFound)
+                {
+                  break;
+                }
+            }
+
+          if (!commonSubnetFound)
+            {
+              continue;
+            }
+
+          Ptr<BridgeNetDevice> bd = NetDeviceIsBridged (remoteDevice);
+          // we have a bridged device, we need to add all 
+          // bridged devices
+          if (bd)
+            {
+              NS_LOG_LOGIC ("Looking through bridge ports of bridge net device " << bd);
+              for (uint32_t j = 0; j < bd->GetNBridgePorts (); ++j)
+                {
+                  Ptr<NetDevice> ndBridged = bd->GetBridgePort (j);
+                  if (ndBridged == remoteDevice)
+                    {
+                      NS_LOG_LOGIC ("That bridge port is me, don't walk backward");
+                      continue;
+                    }
+                  Ptr<Channel> chBridged = ndBridged->GetChannel ();
+                  if (chBridged == 0)
+                    {
+                      continue;
+                    }
+                  GetAdjacentNetDevices (ndBridged, chBridged, netDeviceContainer);
+                }
+            }
+          else
+            {
+              netDeviceContainer.Add (channel->GetDevice (i));
+            }
+        }
+    }
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::BuildIpAddressToNodeMap (void) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  for (NodeList::Iterator it = NodeList::Begin (); it != NodeList::End (); ++it)
+    {
+      Ptr<Node> node = *it;
+      Ptr<IpL3Protocol> ip = node->GetObject<IpL3Protocol> ();
+
+      if(ip)
+        {
+          uint32_t numberOfDevices = node->GetNDevices ();
+
+          for (uint32_t deviceId = 0; deviceId < numberOfDevices; deviceId++)
+            {
+              Ptr<NetDevice> device = node->GetDevice (deviceId);
+
+              // If this is not a loopback device add the IP address to the map
+              if ( !DynamicCast<LoopbackNetDevice>(device) )
+                {
+                  int32_t interfaceIndex = (ip)->GetInterfaceForDevice (node->GetDevice (deviceId));
+                  if (interfaceIndex != -1)
+                    {
+                      g_netdeviceToIpInterfaceMap[device] = (ip)->GetInterface (interfaceIndex);
+
+                      uint32_t numberOfAddresses = ip->GetNAddresses (interfaceIndex);
+                      for (uint32_t addressIndex = 0; addressIndex < numberOfAddresses; addressIndex++)
+                        {
+                          IpInterfaceAddress ifAddr = ip->GetAddress (interfaceIndex, addressIndex);
+                          IpAddress addr = ifAddr.GetAddress ();
+
+                          NS_ABORT_MSG_IF (g_ipAddressToNodeMap.count (addr),
+                                          "Duplicate IP address (" << addr << ") found during NIX Vector map construction for node " << node->GetId ());
+
+                          NS_LOG_LOGIC ("Adding IP address " << addr << " for node " << node->GetId () << " to NIX Vector IP address to node map");
+                          g_ipAddressToNodeMap[addr] = node;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+template <typename T>
+Ptr<Node>
+NixVectorRouting<T>::GetNodeByIp (IpAddress dest) const
+{
+  NS_LOG_FUNCTION (this << dest);
+
+  // Populate lookup table if is empty.
+  if ( g_ipAddressToNodeMap.empty () )
+    {
+      BuildIpAddressToNodeMap ();
+    }
+
+  Ptr<Node> destNode;
+
+  typename IpAddressToNodeMap::iterator iter = g_ipAddressToNodeMap.find(dest);
+
+  if(iter == g_ipAddressToNodeMap.end ())
+    {
+      NS_LOG_ERROR ("Couldn't find dest node given the IP" << dest);
+      destNode = 0;
+    }
+  else
+    {
+      destNode = iter -> second;
+    }
+
+  return destNode;
+}
+
+template <typename T>
+Ptr<typename NixVectorRouting<T>::IpInterface>
+NixVectorRouting<T>::GetInterfaceByNetDevice (Ptr<NetDevice> netDevice) const
+{
+  // Populate lookup table if is empty.
+  if ( g_netdeviceToIpInterfaceMap.empty () )
+    {
+      BuildIpAddressToNodeMap ();
+    }
+
+  Ptr<IpInterface> ipInterface;
+
+  typename NetDeviceToIpInterfaceMap::iterator iter = g_netdeviceToIpInterfaceMap.find(netDevice);
+
+  if(iter == g_netdeviceToIpInterfaceMap.end ())
+    {
+      NS_LOG_ERROR ("Couldn't find IpInterface node given the NetDevice" << netDevice);
+      ipInterface = 0;
+    }
+  else
+    {
+      ipInterface = iter -> second;
+    }
+
+  return ipInterface;
+}
+
+template <typename T>
+uint32_t
+NixVectorRouting<T>::FindTotalNeighbors (Ptr<Node> node) const
+{
+  NS_LOG_FUNCTION (this << node);
+
+  uint32_t numberOfDevices = node->GetNDevices ();
+  uint32_t totalNeighbors = 0;
+
+  // scan through the net devices on the T node
+  // and then look at the nodes adjacent to them
+  for (uint32_t i = 0; i < numberOfDevices; i++)
+    {
+      // Get a net device from the node
+      // as well as the channel, and figure
+      // out the adjacent net devices
+      Ptr<NetDevice> localNetDevice = node->GetDevice (i);
+      Ptr<Channel> channel = localNetDevice->GetChannel ();
+      if (channel == 0)
+        {
+          continue;
+        }
+
+      // this function takes in the local net dev, and channel, and
+      // writes to the netDeviceContainer the adjacent net devs
+      NetDeviceContainer netDeviceContainer;
+      GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
+
+      totalNeighbors += netDeviceContainer.GetN ();
+    }
+
+  return totalNeighbors;
+}
+
+template <typename T>
+Ptr<BridgeNetDevice>
+NixVectorRouting<T>::NetDeviceIsBridged (Ptr<NetDevice> nd) const
+{
+  NS_LOG_FUNCTION (this << nd);
+
+  Ptr<Node> node = nd->GetNode ();
+  uint32_t nDevices = node->GetNDevices ();
+
+  //
+  // There is no bit on a net device that says it is being bridged, so we have
+  // to look for bridges on the node to which the device is attached.  If we
+  // find a bridge, we need to look through its bridge ports (the devices it
+  // bridges) to see if we find the device in question.
+  //
+  for (uint32_t i = 0; i < nDevices; ++i)
+    {
+      Ptr<NetDevice> ndTest = node->GetDevice (i);
+      NS_LOG_LOGIC ("Examine device " << i << " " << ndTest);
+
+      if (ndTest->IsBridge ())
+        {
+          NS_LOG_LOGIC ("device " << i << " is a bridge net device");
+          Ptr<BridgeNetDevice> bnd = ndTest->GetObject<BridgeNetDevice> ();
+          NS_ABORT_MSG_UNLESS (bnd, "NixVectorRouting::NetDeviceIsBridged (): GetObject for <BridgeNetDevice> failed");
+
+          for (uint32_t j = 0; j < bnd->GetNBridgePorts (); ++j)
+            {
+              NS_LOG_LOGIC ("Examine bridge port " << j << " " << bnd->GetBridgePort (j));
+              if (bnd->GetBridgePort (j) == nd)
+                {
+                  NS_LOG_LOGIC ("Net device " << nd << " is bridged by " << bnd);
+                  return bnd;
+                }
+            }
+        }
+    }
+  NS_LOG_LOGIC ("Net device " << nd << " is not bridged");
+  return 0;
+}
+
+template <typename T>
+uint32_t
+NixVectorRouting<T>::FindNetDeviceForNixIndex (Ptr<Node> node, uint32_t nodeIndex, IpAddress & gatewayIp) const
+{
+  NS_LOG_FUNCTION (this << node << nodeIndex << gatewayIp);
+
+  uint32_t numberOfDevices = node->GetNDevices ();
+  uint32_t index = 0;
+  uint32_t totalNeighbors = 0;
+
+  // scan through the net devices on the parent node
+  // and then look at the nodes adjacent to them
+  for (uint32_t i = 0; i < numberOfDevices; i++)
+    {
+      // Get a net device from the node
+      // as well as the channel, and figure
+      // out the adjacent net devices
+      Ptr<NetDevice> localNetDevice = node->GetDevice (i);
+      Ptr<Channel> channel = localNetDevice->GetChannel ();
+      if (channel == 0)
+        {
+          continue;
+        }
+
+      // this function takes in the local net dev, and channel, and
+      // writes to the netDeviceContainer the adjacent net devs
+      NetDeviceContainer netDeviceContainer;
+      GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
+
+      // check how many neighbors we have
+      if (nodeIndex < (totalNeighbors + netDeviceContainer.GetN ()))
+        {
+          // found the proper net device
+          index = i;
+          Ptr<NetDevice> gatewayDevice = netDeviceContainer.Get (nodeIndex-totalNeighbors);
+          Ptr<IpInterface> gatewayInterface = GetInterfaceByNetDevice (gatewayDevice);
+          IpInterfaceAddress ifAddr = gatewayInterface->GetAddress (0);
+          gatewayIp = ifAddr.GetAddress ();
+          break;
+        }
+      totalNeighbors += netDeviceContainer.GetN ();
+    }
+
+  return index;
+}
+
+template <typename T>
+Ptr<typename NixVectorRouting<T>::IpRoute>
+NixVectorRouting<T>::RouteOutput (Ptr<Packet> p, const IpHeader &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr)
+{
+  NS_LOG_FUNCTION (this << header << oif);
+
+  Ptr<IpRoute> rtentry;
+  Ptr<NixVector> nixVectorInCache;
+  Ptr<NixVector> nixVectorForPacket;
+
+  CheckCacheStateAndFlush ();
+
+  IpAddress destAddress = header.GetDestination ();
+
+  NS_LOG_DEBUG ("Dest IP from header: " << destAddress);
+
+  if constexpr (!IsIpv4::value)
+    {
+      /* when sending on link-local multicast, there have to be interface specified */
+      if (destAddress.IsLinkLocalMulticast ())
+        {
+          NS_ASSERT_MSG (oif, "Try to send on link-local multicast address, and no interface index is given!");
+          rtentry = Create<IpRoute> ();
+          rtentry->SetSource (m_ip->SourceAddressSelection (m_ip->GetInterfaceForDevice (oif), destAddress));
+          rtentry->SetDestination (destAddress);
+          rtentry->SetGateway (Ipv6Address::GetZero ());
+          rtentry->SetOutputDevice (oif);
+          return rtentry;
+        }
+    }
+  // Check the Nix cache
+  bool foundInCache = false;
+  nixVectorInCache = GetNixVectorInCache (destAddress, foundInCache);
+
+  // not in cache
+  if (!foundInCache)
+    {
+      NS_LOG_LOGIC ("Nix-vector not in cache, build: ");
+      // Build the nix-vector, given this node and the
+      // dest IP address
+      nixVectorInCache = GetNixVector (m_node, destAddress, oif);
+
+      // cache it
+      m_nixCache.insert (typename NixMap_t::value_type (destAddress, nixVectorInCache));
+    }
+
+  // path exists
+  if (nixVectorInCache)
+    {
+      NS_LOG_LOGIC ("Nix-vector contents: " << *nixVectorInCache);
+
+      // create a new nix vector to be used,
+      // we want to keep the cached version clean
+      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_node);
+        }
+
+      // Get the interface number that we go out of, by extracting
+      // from the nix-vector
+      uint32_t numberOfBits = nixVectorForPacket->BitCount (m_totalNeighbors);
+      uint32_t nodeIndex = nixVectorForPacket->ExtractNeighborIndex (numberOfBits);
+
+      // Search here in a cache for this node index
+      // and look for a IpRoute
+      rtentry = GetIpRouteInCache (destAddress);
+
+      if (!rtentry || !(rtentry->GetOutputDevice () == oif))
+        {
+          // not in cache or a different specified output
+          // device is to be used
+
+          // first, make sure we erase existing (incorrect)
+          // rtentry from the map
+          if (rtentry)
+            {
+              m_ipRouteCache.erase (destAddress);
+            }
+
+          NS_LOG_LOGIC ("IpRoute not in cache, build: ");
+          IpAddress gatewayIp;
+          uint32_t index = FindNetDeviceForNixIndex (m_node, nodeIndex, gatewayIp);
+          int32_t interfaceIndex = 0;
+
+          if (!oif)
+            {
+              interfaceIndex = (m_ip)->GetInterfaceForDevice (m_node->GetDevice (index));
+            }
+          else
+            {
+              interfaceIndex = (m_ip)->GetInterfaceForDevice (oif);
+            }
+
+          NS_ASSERT_MSG (interfaceIndex != -1, "Interface index not found for device");
+
+          IpAddress sourceIPAddr = m_ip->SourceAddressSelection (interfaceIndex, destAddress);
+
+          // start filling in the IpRoute info
+          rtentry = Create<IpRoute> ();
+          rtentry->SetSource (sourceIPAddr);
+
+          rtentry->SetGateway (gatewayIp);
+          rtentry->SetDestination (destAddress);
+
+          if (!oif)
+            {
+              rtentry->SetOutputDevice (m_ip->GetNetDevice (interfaceIndex));
+            }
+          else
+            {
+              rtentry->SetOutputDevice (oif);
+            }
+
+          sockerr = Socket::ERROR_NOTERROR;
+
+          // add rtentry to cache
+          m_ipRouteCache.insert (typename IpRouteMap_t::value_type (destAddress, rtentry));
+        }
+
+      NS_LOG_LOGIC ("Nix-vector contents: " << *nixVectorInCache << " : Remaining bits: " << nixVectorForPacket->GetRemainingBits ());
+
+      // Add  nix-vector in the packet class
+      // make sure the packet exists first
+      if (p)
+        {
+          NS_LOG_LOGIC ("Adding Nix-vector to packet: " << *nixVectorForPacket);
+          p->SetNixVector (nixVectorForPacket);
+        }
+    }
+  else // path doesn't exist
+    {
+      NS_LOG_ERROR ("No path to the dest: " << destAddress);
+      sockerr = Socket::ERROR_NOROUTETOHOST;
+    }
+
+  return rtentry;
+}
+
+template <typename T>
+bool
+NixVectorRouting<T>::RouteInput (Ptr<const Packet> p, const IpHeader &header, Ptr<const NetDevice> idev,
+                                 UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+                                 LocalDeliverCallback lcb, ErrorCallback ecb)
+{
+  NS_LOG_FUNCTION (this << p << header << header.GetSource () << header.GetDestination () << idev);
+
+  CheckCacheStateAndFlush ();
+
+  NS_ASSERT (m_ip != 0);
+  // Check if input device supports IP
+  NS_ASSERT (m_ip->GetInterfaceForDevice (idev) >= 0);
+  uint32_t iif = m_ip->GetInterfaceForDevice (idev);
+  // Check if input device supports IP
+  NS_ASSERT (iif >= 0);
+
+  IpAddress destAddress = header.GetDestination ();
+
+  if constexpr (IsIpv4::value)
+    {
+      // Local delivery
+      if (m_ip->IsDestinationAddress (destAddress, iif))
+        {
+          if (!lcb.IsNull ())
+            {
+              NS_LOG_LOGIC ("Local delivery to " << destAddress);
+              lcb (p, header, iif);
+              return true;
+            }
+          else
+            {
+              // The local delivery callback is null.  This may be a multicast
+              // or broadcast packet, so return false so that another
+              // multicast routing protocol can handle it.  It should be possible
+              // to extend this to explicitly check whether it is a unicast
+              // packet, and invoke the error callback if so
+              return false;
+            }
+        }
+    }
+  else
+    {
+      if (destAddress.IsMulticast ())
+        {
+          NS_LOG_LOGIC ("Multicast route not supported by Nix-Vector routing " << destAddress);
+          return false; // Let other routing protocols try to handle this
+        }
+
+      // Check if input device supports IP forwarding
+      if (m_ip->IsForwarding (iif) == false)
+        {
+          NS_LOG_LOGIC ("Forwarding disabled for this interface");
+          if (!ecb.IsNull ())
+            {
+              ecb (p, header, Socket::ERROR_NOROUTETOHOST);
+            }
+          return true;
+        }
+    }
+
+  Ptr<IpRoute> rtentry;
+
+  // Get the nix-vector from the packet
+  Ptr<NixVector> nixVector = p->GetNixVector ();
+
+  // If nixVector isn't in packet, something went wrong
+  NS_ASSERT (nixVector);
+
+  // Get the interface number that we go out of, by extracting
+  // from the nix-vector
+  if (m_totalNeighbors == 0)
+    {
+      m_totalNeighbors = FindTotalNeighbors (m_node);
+    }
+  uint32_t numberOfBits = nixVector->BitCount (m_totalNeighbors);
+  uint32_t nodeIndex = nixVector->ExtractNeighborIndex (numberOfBits);
+
+  rtentry = GetIpRouteInCache (destAddress);
+  // not in cache
+  if (!rtentry)
+    {
+      NS_LOG_LOGIC ("IpRoute not in cache, build: ");
+      IpAddress gatewayIp;
+      uint32_t index = FindNetDeviceForNixIndex (m_node, nodeIndex, gatewayIp);
+      uint32_t interfaceIndex = (m_ip)->GetInterfaceForDevice (m_node->GetDevice (index));
+      IpInterfaceAddress ifAddr = m_ip->GetAddress (interfaceIndex, 0);
+
+      // start filling in the IpRoute info
+      rtentry = Create<IpRoute> ();
+      rtentry->SetSource (ifAddr.GetAddress ());
+
+      rtentry->SetGateway (gatewayIp);
+      rtentry->SetDestination (destAddress);
+      rtentry->SetOutputDevice (m_ip->GetNetDevice (interfaceIndex));
+
+      // add rtentry to cache
+      m_ipRouteCache.insert (typename IpRouteMap_t::value_type (destAddress, rtentry));
+    }
+
+  NS_LOG_LOGIC ("At Node " << m_node->GetId () << ", Extracting " << numberOfBits <<
+                " bits from Nix-vector: " << nixVector << " : " << *nixVector);
+
+  // call the unicast callback
+  // local deliver is handled by Ipv4StaticRoutingImpl
+  // so this code is never even called if the packet is
+  // destined for this node.
+  if constexpr (IsIpv4::value)
+    {
+      ucb (rtentry, p, header);
+    }
+  else
+    {
+      ucb (idev, rtentry, p, header);
+    }
+
+  return true;
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
+{
+  NS_LOG_FUNCTION_NOARGS ();
+
+  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_ip->template GetObject<Node> ()->GetId ()
+      << ", Time: " << Now().As (unit)
+      << ", Local time: " << m_ip->template GetObject<Node> ()->GetLocalTime ().As (unit)
+      << ", Nix Routing" << std::endl;
+
+  *os << "NixCache:" << std::endl;
+  if (m_nixCache.size () > 0)
+    {
+      *os << std::setw (30) << "Destination";
+      *os << "NixVector" << std::endl;
+      for (typename NixMap_t::const_iterator it = m_nixCache.begin (); it != m_nixCache.end (); it++)
+        {
+          std::ostringstream dest;
+          dest << it->first;
+          *os << std::setw (30) << dest.str ();
+          if (it->second)
+            {
+              *os << *(it->second) << std::endl;
+            }
+        }
+    }
+  *os << "IpRouteCache:" << std::endl;
+  if (m_ipRouteCache.size () > 0)
+    {
+      *os << std::setw (30) << "Destination";
+      *os << std::setw (30) << "Gateway";
+      *os << std::setw (30) << "Source";
+      *os << "OutputDevice" << std::endl;
+      for (typename IpRouteMap_t::const_iterator it = m_ipRouteCache.begin (); it != m_ipRouteCache.end (); it++)
+        {
+          std::ostringstream dest, gw, src;
+          dest << it->second->GetDestination ();
+          *os << std::setw (30) << dest.str ();
+          gw << it->second->GetGateway ();
+          *os << std::setw (30) << gw.str ();
+          src << it->second->GetSource ();
+          *os << std::setw (30) << src.str ();
+          *os << "  ";
+          if (Names::FindName (it->second->GetOutputDevice ()) != "")
+            {
+              *os << Names::FindName (it->second->GetOutputDevice ());
+            }
+          else
+            {
+              *os << it->second->GetOutputDevice ()->GetIfIndex ();
+            }
+          *os << std::endl;
+        }
+    }
+  *os << std::endl;
+  // Restore the previous ostream state
+  (*os).copyfmt (oldState);
+}
+
+// virtual functions from Ipv4RoutingProtocol 
+template <typename T>
+void
+NixVectorRouting<T>::NotifyInterfaceUp (uint32_t i)
+{
+  g_isCacheDirty = true;
+}
+template <typename T>
+void
+NixVectorRouting<T>::NotifyInterfaceDown (uint32_t i)
+{
+  g_isCacheDirty = true;
+}
+template <typename T>
+void
+NixVectorRouting<T>::NotifyAddAddress (uint32_t interface, IpInterfaceAddress address)
+{
+  g_isCacheDirty = true;
+}
+template <typename T>
+void
+NixVectorRouting<T>::NotifyRemoveAddress (uint32_t interface, IpInterfaceAddress address)
+{
+  g_isCacheDirty = true;
+}
+template <typename T>
+void
+NixVectorRouting<T>::NotifyAddRoute (IpAddress dst, Ipv6Prefix mask, IpAddress nextHop, uint32_t interface, IpAddress prefixToUse)
+{
+  g_isCacheDirty = true;
+}
+template <typename T>
+void
+NixVectorRouting<T>::NotifyRemoveRoute (IpAddress dst, Ipv6Prefix mask, IpAddress nextHop, uint32_t interface, IpAddress prefixToUse)
+{
+  g_isCacheDirty = true;
+}
+
+template <typename T>
+bool
+NixVectorRouting<T>::BFS (uint32_t numberOfNodes, Ptr<Node> source,
+                           Ptr<Node> dest, std::vector< Ptr<Node> > & parentVector,
+                           Ptr<NetDevice> oif) const
+{
+  NS_LOG_FUNCTION (this << numberOfNodes << source << dest << parentVector << oif);
+
+  NS_LOG_LOGIC ("Going from Node " << source->GetId () << " to Node " << dest->GetId ());
+  std::queue< Ptr<Node> > greyNodeList;  // discovered nodes with unexplored children
+
+  // reset the parent vector
+  parentVector.assign (numberOfNodes, 0); // initialize to 0
+
+  // Add the source node to the queue, set its parent to itself
+  greyNodeList.push (source);
+  parentVector.at (source->GetId ()) = source;
+
+  // BFS loop
+  while (greyNodeList.size () != 0)
+    {
+      Ptr<Node> currNode = greyNodeList.front ();
+      Ptr<IpL3Protocol> ip = currNode->GetObject<IpL3Protocol> ();
+ 
+      if (currNode == dest) 
+        {
+          NS_LOG_LOGIC ("Made it to Node " << currNode->GetId ());
+          return true;
+        }
+
+      // if this is the first iteration of the loop and a 
+      // specific output interface was given, make sure 
+      // we go this way
+      if (currNode == source && oif)
+        {
+          // make sure that we can go this way
+          if (ip)
+            {
+              uint32_t interfaceIndex = (ip)->GetInterfaceForDevice (oif);
+              if (!(ip->IsUp (interfaceIndex)))
+                {
+                  NS_LOG_LOGIC ("IpInterface is down");
+                  return false;
+                }
+            }
+          if (!(oif->IsLinkUp ()))
+            {
+              NS_LOG_LOGIC ("Link is down.");
+              return false;
+            }
+          Ptr<Channel> channel = oif->GetChannel ();
+          if (channel == 0)
+            { 
+              return false;
+            }
+
+          // this function takes in the local net dev, and channel, and
+          // writes to the netDeviceContainer the adjacent net devs
+          NetDeviceContainer netDeviceContainer;
+          GetAdjacentNetDevices (oif, channel, netDeviceContainer);
+
+          // Finally we can get the adjacent nodes
+          // and scan through them.  We push them
+          // to the greyNode queue, if they aren't 
+          // already there.
+          for (NetDeviceContainer::Iterator iter = netDeviceContainer.Begin (); iter != netDeviceContainer.End (); iter++)
+            {
+              Ptr<Node> remoteNode = (*iter)->GetNode ();
+              Ptr<IpInterface> remoteIpInterface = GetInterfaceByNetDevice(*iter);
+              if (remoteIpInterface == 0 || !(remoteIpInterface->IsUp ()))
+                {
+                  NS_LOG_LOGIC ("IpInterface either doesn't exist or is down");
+                  continue;
+                }
+
+              // check to see if this node has been pushed before
+              // by checking to see if it has a parent
+              // if it doesn't (null or 0), then set its parent and
+              // push to the queue
+              if (parentVector.at (remoteNode->GetId ()) == 0)
+                {
+                  parentVector.at (remoteNode->GetId ()) = currNode;
+                  greyNodeList.push (remoteNode);
+                }
+            }
+        }
+      else
+        {
+          // Iterate over the current node's adjacent vertices
+          // and push them into the queue
+          for (uint32_t i = 0; i < (currNode->GetNDevices ()); i++)
+            {
+              // Get a net device from the node
+              // as well as the channel, and figure
+              // out the adjacent net device
+              Ptr<NetDevice> localNetDevice = currNode->GetDevice (i);
+
+              // make sure that we can go this way
+              if (ip)
+                {
+                  uint32_t interfaceIndex = (ip)->GetInterfaceForDevice (currNode->GetDevice (i));
+                  if (!(ip->IsUp (interfaceIndex)))
+                    {
+                      NS_LOG_LOGIC ("IpInterface is down");
+                      continue;
+                    }
+                }
+              if (!(localNetDevice->IsLinkUp ()))
+                {
+                  NS_LOG_LOGIC ("Link is down.");
+                  continue;
+                }
+              Ptr<Channel> channel = localNetDevice->GetChannel ();
+              if (channel == 0)
+                { 
+                  continue;
+                }
+
+              // this function takes in the local net dev, and channel, and
+              // writes to the netDeviceContainer the adjacent net devs
+              NetDeviceContainer netDeviceContainer;
+              GetAdjacentNetDevices (localNetDevice, channel, netDeviceContainer);
+
+              // Finally we can get the adjacent nodes
+              // and scan through them.  We push them
+              // to the greyNode queue, if they aren't 
+              // already there.
+              for (NetDeviceContainer::Iterator iter = netDeviceContainer.Begin (); iter != netDeviceContainer.End (); iter++)
+                {
+                  Ptr<Node> remoteNode = (*iter)->GetNode ();
+                  Ptr<IpInterface> remoteIpInterface = GetInterfaceByNetDevice(*iter);
+                  if (remoteIpInterface == 0 || !(remoteIpInterface->IsUp ()))
+                    {
+                      NS_LOG_LOGIC ("IpInterface either doesn't exist or is down");
+                      continue;
+                    }
+
+                  // check to see if this node has been pushed before
+                  // by checking to see if it has a parent
+                  // if it doesn't (null or 0), then set its parent and
+                  // push to the queue
+                  if (parentVector.at (remoteNode->GetId ()) == 0)
+                    {
+                      parentVector.at (remoteNode->GetId ()) = currNode;
+                      greyNodeList.push (remoteNode);
+                    }
+                }
+            }
+        }
+
+      // Pop off the head grey node.  We have all its children.
+      // It is now black.
+      greyNodeList.pop ();
+    }
+
+  // Didn't find the dest...
+  return false;
+}
+
+template <typename T>
+void
+NixVectorRouting<T>::PrintRoutingPath (Ptr<Node> source, IpAddress dest,
+                                        Ptr<OutputStreamWrapper> stream, Time::Unit unit) const
+{
+  NS_LOG_FUNCTION (this << source << dest);
+
+  Ptr<NixVector> nixVectorInCache;
+  Ptr<NixVector> nixVector;
+  Ptr<IpRoute> 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: ";
+
+  // Check the Nix cache
+  bool foundInCache = true;
+  nixVectorInCache = GetNixVectorInCache (dest, foundInCache);
+
+  // not in cache
+  if (!foundInCache)
+    {
+      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);
+      // cache it
+      m_nixCache.insert (typename NixMap_t::value_type (dest, nixVectorInCache));
+    }
+
+  if (nixVectorInCache || (!nixVectorInCache && source == destNode))
+    {
+      Ptr<Node> curr = source;
+      uint32_t totalNeighbors = 0;
+
+      if (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 addr, node;
+          addr << dest;
+          node << "(Node " << destNode->GetId () << ")";
+          *os << std::setw (25) << addr.str ();
+          *os << std::setw (10) << node.str ();
+          *os << "---->   ";
+          *os << std::setw (25) << addr.str ();
+          *os << node.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
+          IpAddress 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<IpL3Protocol> ip = curr->GetObject<IpL3Protocol> ();
+          Ptr<NetDevice> outDevice = curr->GetDevice (netDeviceIndex);
+          uint32_t interfaceIndex = ip->GetInterfaceForDevice (outDevice);
+          IpAddress sourceIPAddr;
+          if (curr == source)
+            {
+              sourceIPAddr = ip->SourceAddressSelection (interfaceIndex, dest);
+            }
+          else
+            {
+              // We use the first address because it's indifferent which one
+              // we use to identify intermediate routers
+              sourceIPAddr = ip->GetAddress (interfaceIndex, 0).GetAddress ();
+            }
+
+          std::ostringstream currAddr, currNode, nextAddr, nextNode;
+          currAddr << sourceIPAddr;
+          currNode << "(Node " << curr->GetId () << ")";
+          *os << std::setw (25) << currAddr.str ();
+          *os << std::setw (10) << currNode.str ();
+          // Replace curr with the next node
+          curr = GetNodeByIp (gatewayIp);
+          nextAddr << ((curr == destNode) ? dest : gatewayIp);
+          nextNode << "(Node " << curr->GetId () << ")";
+          *os << "---->   ";
+          *os << std::setw (25) << nextAddr.str ();
+          *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);
+}
+
+template <typename T>
+void 
+NixVectorRouting<T>::CheckCacheStateAndFlush (void) const
+{
+  if (g_isCacheDirty)
+    {
+      FlushGlobalNixRoutingCache ();
+      g_isCacheDirty = false;
+    }
+}
+
+/* Public template function declarations */
+template void NixVectorRouting<Ipv4RoutingProtocol>::SetNode (Ptr<Node> node);
+template void NixVectorRouting<Ipv6RoutingProtocol>::SetNode (Ptr<Node> node);
+template void NixVectorRouting<Ipv4RoutingProtocol>::FlushGlobalNixRoutingCache (void) const;
+template void NixVectorRouting<Ipv6RoutingProtocol>::FlushGlobalNixRoutingCache (void) const;
+template void NixVectorRouting<Ipv4RoutingProtocol>::PrintRoutingPath (Ptr<Node> source, IpAddress dest,
+                                                                       Ptr<OutputStreamWrapper> stream, Time::Unit unit) const;
+template void NixVectorRouting<Ipv6RoutingProtocol>::PrintRoutingPath (Ptr<Node> source, IpAddress dest,
+                                                                       Ptr<OutputStreamWrapper> stream, Time::Unit unit) const;
+
+} // namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/model/nix-vector-routing.h ns-3.35/src/nix-vector-routing/model/nix-vector-routing.h
--- ns-3.34/src/nix-vector-routing/model/nix-vector-routing.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/nix-vector-routing/model/nix-vector-routing.h	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,502 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2009 The Georgia Institute of Technology
+ * 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
+ * 
+ * This file is adapted from the old ipv4-nix-vector-routing.h.
+ *
+ * Authors: Josh Pelkey <jpelkey@gatech.edu>
+ * 
+ * Modified by: Ameya Deshpande <ameyanrd@outlook.com>
+ */
+
+#ifndef NIX_VECTOR_ROUTING_H
+#define NIX_VECTOR_ROUTING_H
+
+#include "ns3/channel.h"
+#include "ns3/node-container.h"
+#include "ns3/node-list.h"
+#include "ns3/net-device-container.h"
+#include "ns3/ipv4-routing-protocol.h"
+#include "ns3/ipv4-route.h"
+#include "ns3/ipv6-route.h"
+#include "ns3/ipv6-routing-protocol.h"
+#include "ns3/nix-vector.h"
+#include "ns3/bridge-net-device.h"
+#include "ns3/nstime.h"
+#include "ns3/ipv4-interface.h"
+#include "ns3/ipv6-interface.h"
+#include "ns3/ipv4-l3-protocol.h"
+#include "ns3/ipv6-l3-protocol.h"
+
+#include <map>
+#include <unordered_map>
+
+namespace ns3 {
+
+/**
+ * \defgroup nix-vector-routing Nix-Vector Routing
+ *
+ * Nix-vector routing is a simulation specific routing protocol and is
+ * intended for large network topologies.
+ */
+
+/**
+ * \ingroup nix-vector-routing
+ * Nix-vector routing protocol
+ *
+ * \internal
+ * Since this class is meant to be specialized only by Ipv4RoutingProtocol or 
+ * Ipv6RoutingProtocol the implementation of this class doesn't need to be
+ * exposed here; it is in nix-vector-routing.cc.
+ */
+template <typename T>
+class NixVectorRouting : public std::enable_if<std::is_same<Ipv4RoutingProtocol, T>::value || std::is_same<Ipv6RoutingProtocol, T>::value, T>::type
+{
+  /// Alias for determining whether the parent is Ipv4RoutingProtocol or Ipv6RoutingProtocol
+  using IsIpv4 = std::is_same <Ipv4RoutingProtocol, T>;
+
+  /// Alias for Ipv4 and Ipv6 classes
+  using Ip = typename std::conditional <IsIpv4::value, Ipv4, Ipv6>::type;
+
+  /// Alias for Ipv4Address and Ipv6Address classes
+  using IpAddress = typename std::conditional<IsIpv4::value, Ipv4Address, Ipv6Address>::type;
+
+  /// Alias for Ipv4Route and Ipv6Route classes
+  using IpRoute = typename std::conditional<IsIpv4::value, Ipv4Route, Ipv6Route>::type;
+
+  /// Alias for Ipv4AddressHash and Ipv6AddressHash classes
+  using IpAddressHash = typename std::conditional<IsIpv4::value, Ipv4AddressHash, Ipv6AddressHash>::type;
+
+  /// Alias for Ipv4Header and Ipv6Header classes
+  using IpHeader = typename std::conditional<IsIpv4::value, Ipv4Header, Ipv6Header>::type;
+
+  /// Alias for Ipv4InterfaceAddress and Ipv6InterfaceAddress classes
+  using IpInterfaceAddress = typename std::conditional<IsIpv4::value, Ipv4InterfaceAddress, Ipv6InterfaceAddress>::type;
+
+  /// Alias for Ipv4Interface and Ipv6Interface classes
+  using IpInterface = typename std::conditional<IsIpv4::value, Ipv4Interface, Ipv6Interface>::type;
+
+  /// Alias for Ipv4L3Protocol and Ipv4L3Protocol classes
+  using IpL3Protocol = typename std::conditional<IsIpv4::value, Ipv4L3Protocol, Ipv6L3Protocol>::type;
+
+public:
+  NixVectorRouting ();
+  ~NixVectorRouting ();
+  /**
+   * @brief The Interface ID of the Global Router interface.
+   * @return The Interface ID
+   * @see Object::GetObject ()
+   */
+  static TypeId GetTypeId (void);
+  /**
+   * @brief Set the Node pointer of the node for which this
+   * routing protocol is to be placed
+   *
+   * @param node Node pointer
+   */
+  void SetNode (Ptr<Node> node);
+
+  /**
+   * @brief Called when run-time link topology change occurs
+   * which iterates through the node list and flushes any
+   * nix vector caches
+   *
+   * \internal
+   * \c const is used here due to need to potentially flush the cache
+   * in const methods such as PrintRoutingTable.  Caches are stored in
+   * mutable variables and flushed in const methods.
+   */
+  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
+   * 
+   * \note IpAddress is alias for either Ipv4Address or Ipv6Address
+   *       depending on on whether the network is IPv4 or IPv6 respectively.
+   */
+  void PrintRoutingPath (Ptr<Node> source, IpAddress dest, Ptr<OutputStreamWrapper> stream, Time::Unit unit) const;
+
+
+private:
+
+  /**
+   * Flushes the cache which stores nix-vector based on
+   * destination IP
+   */
+  void FlushNixCache (void) const;
+
+  /**
+   * Flushes the cache which stores the Ip route
+   * based on the destination IP
+   */
+  void FlushIpRouteCache (void) const;
+
+  /**
+   * Upon a run-time topology change caches are
+   * flushed and the total number of neighbors is
+   * reset to zero
+   */
+  void ResetTotalNeighbors (void);
+
+  /**
+   * Takes in the source node and dest IP and calls GetNodeByIp,
+   * BFS, accounting for any output interface specified, and finally
+   * BuildNixVector to return the built nix-vector
+   *
+   * \param source Source node
+   * \param dest Destination node address
+   * \param oif Preferred output interface
+   * \returns The NixVector to be used in routing.
+   */
+  Ptr<NixVector> GetNixVector (Ptr<Node> source, IpAddress dest, Ptr<NetDevice> oif) const;
+
+  /**
+   * Checks the cache based on dest IP for the nix-vector
+   * \param address Address to check
+   * \param foundInCache Address found in cache
+   * \returns The NixVector to be used in routing.
+   */
+  Ptr<NixVector> GetNixVectorInCache (const IpAddress &address,  bool &foundInCache) const;
+
+  /**
+   * Checks the cache based on dest IP for the IpRoute
+   * \param address Address to check
+   * \returns The cached route.
+   */
+  Ptr<IpRoute> GetIpRouteInCache (IpAddress address);
+
+  /**
+   * Given a net-device returns all the adjacent net-devices,
+   * essentially getting the neighbors on that channel
+   * \param [in] netDevice the NetDevice attached to the channel.
+   * \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) const;
+
+  /**
+   * Iterates through the node list and finds the one
+   * corresponding to the given IpAddress
+   * \param dest destination node IP
+   * \return The node with the specified IP.
+   */
+  Ptr<Node> GetNodeByIp (IpAddress dest) const;
+
+  /**
+   * Iterates through the node list and finds the one
+   * corresponding to the given IpAddress
+   * \param netDevice NetDevice pointer
+   * \return The node with the specified IP.
+   */
+  Ptr<IpInterface> GetInterfaceByNetDevice (Ptr<NetDevice> netDevice) const;
+
+  /**
+   * Recurses the T vector, created by BFS and actually builds the nixvector
+   * \param [in] parentVector Parent vector for retracing routes
+   * \param [in] source Source Node index
+   * \param [in] dest Destination Node index
+   * \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) const;
+
+  /**
+   * Special variation of BuildNixVector for when a node is sending to itself
+   * \param [out] nixVector the NixVector to be used for routing
+   * \returns true on success, false otherwise.
+   */
+  bool BuildNixVectorLocal (Ptr<NixVector> nixVector);
+
+  /**
+   * 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 (Ptr<Node> node) const;
+
+
+  /**
+   * Determine if the NetDevice is bridged
+   * \param nd the NetDevice to check
+   * \returns the bridging NetDevice (or null if the NetDevice is not bridged)
+   */
+  Ptr<BridgeNetDevice> NetDeviceIsBridged (Ptr<NetDevice> nd) const;
+
+
+  /**
+   * 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 (Ptr<Node> node, uint32_t nodeIndex, IpAddress & gatewayIp) const;
+
+  /**
+   * \brief Breadth first search algorithm.
+   * \param [in] numberOfNodes total number of nodes
+   * \param [in] source Source Node
+   * \param [in] dest Destination Node
+   * \param [out] parentVector Parent vector for retracing routes
+   * \param [in] oif specific output interface to use from source node, if not null
+   * \returns false if dest not found, true o.w.
+   */
+  bool BFS (uint32_t numberOfNodes,
+            Ptr<Node> source,
+            Ptr<Node> dest,
+            std::vector< Ptr<Node> > & parentVector,
+            Ptr<NetDevice> oif) const;
+
+  /**
+   * \sa Ipv4RoutingProtocol::DoInitialize
+   * \sa Ipv6RoutingProtocol::DoInitialize
+   */
+  void DoInitialize ();
+
+  /**
+   * \sa Ipv4RoutingProtocol::DoDispose
+   * \sa Ipv6RoutingProtocol::DoDispose
+   */
+  void DoDispose (void);
+
+  /// Map of IpAddress to NixVector
+  typedef std::map<IpAddress, Ptr<NixVector> > NixMap_t;
+  /// Map of IpAddress to IpRoute
+  typedef std::map<IpAddress, Ptr<IpRoute> > IpRouteMap_t;
+
+  /// Callback for IPv4 unicast packets to be forwarded
+  typedef Callback<void, Ptr<IpRoute>, Ptr<const Packet>, const IpHeader &> UnicastForwardCallbackv4;
+
+  /// Callback for IPv6 unicast packets to be forwarded
+  typedef Callback<void, Ptr<const NetDevice>, Ptr<IpRoute>, Ptr<const Packet>, const IpHeader &> UnicastForwardCallbackv6;
+
+  /// Callback for unicast packets to be forwarded
+  typedef typename std::conditional<IsIpv4::value, UnicastForwardCallbackv4, UnicastForwardCallbackv6>::type UnicastForwardCallback;
+
+  /// Callback for IPv4 multicast packets to be forwarded
+  typedef Callback<void, Ptr<Ipv4MulticastRoute>, Ptr<const Packet>, const IpHeader &> MulticastForwardCallbackv4;
+
+  /// Callback for IPv6 multicast packets to be forwarded
+  typedef Callback<void, Ptr<const NetDevice>, Ptr<Ipv6MulticastRoute>, Ptr<const Packet>, const IpHeader &> MulticastForwardCallbackv6;
+
+  /// Callback for multicast packets to be forwarded
+  typedef typename std::conditional<IsIpv4::value, MulticastForwardCallbackv4, MulticastForwardCallbackv6>::type MulticastForwardCallback;
+
+  /// Callback for packets to be locally delivered
+  typedef Callback<void, Ptr<const Packet>, const IpHeader &, uint32_t > LocalDeliverCallback;
+
+  /// Callback for routing errors (e.g., no route found)
+  typedef Callback<void, Ptr<const Packet>, const IpHeader &, Socket::SocketErrno > ErrorCallback;
+
+  /* From Ipv4RoutingProtocol and Ipv6RoutingProtocol */
+  /**
+   * \brief Query routing cache for an existing route, for an outbound packet
+   * \param p packet to be routed.  Note that this method may modify the packet.
+   *          Callers may also pass in a null pointer.
+   * \param header input parameter (used to form key to search for the route)
+   * \param oif Output interface Netdevice.  May be zero, or may be bound via
+   *            socket options to a particular output interface.
+   * \param sockerr Output parameter; socket errno
+   *
+   * \returns a code that indicates what happened in the lookup
+   *
+   * \sa Ipv4RoutingProtocol::RouteOutput
+   * \sa Ipv6RoutingProtocol::RouteOutput
+   */
+  virtual Ptr<IpRoute> RouteOutput (Ptr<Packet> p, const IpHeader &header, Ptr<NetDevice> oif, Socket::SocketErrno &sockerr);
+
+  /**
+   * \brief Route an input packet (to be forwarded or locally delivered)
+   * \param p received packet
+   * \param header input parameter used to form a search key for a route
+   * \param idev Pointer to ingress network device
+   * \param ucb Callback for the case in which the packet is to be forwarded
+   *            as unicast
+   * \param mcb Callback for the case in which the packet is to be forwarded
+   *            as multicast
+   * \param lcb Callback for the case in which the packet is to be locally
+   *            delivered
+   * \param ecb Callback to call if there is an error in forwarding
+   *
+   * \returns true if NixVectorRouting class takes responsibility for
+   *          forwarding or delivering the packet, false otherwise
+   *
+   * \sa Ipv4RoutingProtocol::RouteInput
+   * \sa Ipv6RoutingProtocol::RouteInput
+   */
+  virtual bool RouteInput (Ptr<const Packet> p, const IpHeader &header, Ptr<const NetDevice> idev,
+                           UnicastForwardCallback ucb, MulticastForwardCallback mcb,
+                           LocalDeliverCallback lcb, ErrorCallback ecb);
+  
+  /**
+   * \param interface the index of the interface we are being notified about
+   *
+   * \sa Ipv4RoutingProtocol::NotifyInterfaceUp
+   * \sa Ipv6RoutingProtocol::NotifyInterfaceUp
+   */
+  virtual void NotifyInterfaceUp (uint32_t interface);
+
+  /**
+   * \param interface the index of the interface we are being notified about
+   *
+   * \sa Ipv4RoutingProtocol::NotifyInterfaceDown
+   * \sa Ipv6RoutingProtocol::NotifyInterfaceDown
+   */
+  virtual void NotifyInterfaceDown (uint32_t interface);
+
+  /**
+   * \param interface the index of the interface we are being notified about
+   * \param address a new address being added to an interface
+   *
+   * \sa Ipv4RoutingProtocol::NotifyAddAddress
+   * \sa Ipv6RoutingProtocol::NotifyAddAddress
+   */
+  virtual void NotifyAddAddress (uint32_t interface, IpInterfaceAddress address);
+
+  /**
+   * \param interface the index of the interface we are being notified about
+   * \param address a new address being added to an interface
+   *
+   * \sa Ipv4RoutingProtocol::NotifyRemoveAddress
+   * \sa Ipv6RoutingProtocol::NotifyRemoveAddress
+   */
+  virtual void NotifyRemoveAddress (uint32_t interface, IpInterfaceAddress address);
+
+  /**
+   * \brief Print the Routing Table entries
+   *
+   * \param stream The ostream the Routing table is printed to
+   * \param unit The time unit to be used in the report
+   *
+   * \sa Ipv4RoutingProtocol::PrintRoutingTable
+   * \sa Ipv6RoutingProtocol::PrintRoutingTable
+   */
+  virtual void PrintRoutingTable (Ptr<OutputStreamWrapper> stream, Time::Unit unit = Time::S) const;
+
+  /* From IPv4RoutingProtocol */
+  /**
+   * \brief Typically, invoked directly or indirectly from ns3::Ipv4::SetRoutingProtocol
+   *
+   * \param ipv4 the ipv4 object this routing protocol is being associated with
+   *
+   * \sa Ipv4RoutingProtocol::SetIpv4
+   */
+  virtual void SetIpv4 (Ptr<Ip> ipv4);
+
+  /* From IPv6RoutingProtocol */
+  /**
+   * \brief Typically, invoked directly or indirectly from ns3::Ipv6::SetRoutingProtocol
+   *
+   * \param ipv6 the ipv6 object this routing protocol is being associated with
+   *
+   * \sa Ipv6RoutingProtocol::SetIpv6
+   */
+  virtual void SetIpv6 (Ptr<Ip> ipv6);
+
+  /**
+   * \brief Notify a new route.
+   *
+   * \param dst destination address
+   * \param mask destination mask
+   * \param nextHop nextHop for this destination
+   * \param interface output interface
+   * \param prefixToUse prefix to use as source with this route
+   *
+   * \sa Ipv6RoutingProtocol::NotifyAddRoute
+   */
+  virtual void NotifyAddRoute (IpAddress dst, Ipv6Prefix mask, IpAddress nextHop, uint32_t interface, IpAddress prefixToUse = IpAddress::GetZero ());
+
+  /**
+   * \brief Notify route removing.
+   *
+   * \param dst destination address
+   * \param mask destination mask
+   * \param nextHop nextHop for this destination
+   * \param interface output interface
+   * \param prefixToUse prefix to use as source with this route
+   *
+   * \sa Ipv6RoutingProtocol::NotifyRemoveRoute
+   */
+  virtual void NotifyRemoveRoute (IpAddress dst, Ipv6Prefix mask, IpAddress nextHop, uint32_t interface, IpAddress prefixToUse = IpAddress::GetZero ());
+
+  /**
+   * Flushes routing caches if required.
+   */
+  void CheckCacheStateAndFlush (void) const;
+
+  /**
+   * Build map from IP Address to Node for faster lookup.
+   */
+  void BuildIpAddressToNodeMap (void) const;
+
+  /**
+   * Flag to mark when caches are dirty and need to be flushed.  
+   * Used for lazy cleanup of caches when there are many topology changes.
+   */
+  static bool g_isCacheDirty;
+
+  /** Cache stores nix-vectors based on destination ip */
+  mutable NixMap_t m_nixCache;
+
+  /** Cache stores IpRoutes based on destination ip */
+  mutable IpRouteMap_t m_ipRouteCache;
+
+  Ptr<Ip> m_ip; //!< IP object
+  Ptr<Node> m_node; //!< Node object
+
+  /** Total neighbors used for nix-vector to determine number of bits */
+  uint32_t m_totalNeighbors;
+
+
+  /**
+   * Mapping of IP address to ns-3 node.
+   *
+   * Used to avoid linear searching of nodes/devices to find a node in
+   * GetNodeByIp() method.  NIX vector routing assumes IP addresses
+   * are unique so mapping can be done without duplication.
+   **/
+  typedef std::unordered_map<IpAddress, ns3::Ptr<ns3::Node>, IpAddressHash > IpAddressToNodeMap;
+  static IpAddressToNodeMap g_ipAddressToNodeMap; //!< Address to node map.
+
+  /// Mapping of Ptr<NetDevice> to Ptr<IpInterface>.
+  typedef std::unordered_map<Ptr<NetDevice>, Ptr<IpInterface>> NetDeviceToIpInterfaceMap;
+  static NetDeviceToIpInterfaceMap g_netdeviceToIpInterfaceMap; //!< NetDevice pointer to IpInterface pointer map
+};
+
+
+/**
+ * \ingroup nix-vector-routing
+ * Create the typedef Ipv4NixVectorRouting with T as Ipv4RoutingProtocol
+ *
+ * Note: This typedef enables also backwards compatibility with original Ipv4NixVectorRouting.
+ */
+typedef NixVectorRouting<Ipv4RoutingProtocol> Ipv4NixVectorRouting;
+
+/**
+ * \ingroup nix-vector-routing
+ * Create the typedef Ipv6NixVectorRouting with T as Ipv6RoutingProtocol
+ */
+typedef NixVectorRouting<Ipv6RoutingProtocol> Ipv6NixVectorRouting;
+} // namespace ns3
+
+#endif /* NIX_VECTOR_ROUTING_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/test/nix-test.cc ns-3.35/src/nix-vector-routing/test/nix-test.cc
--- ns-3.34/src/nix-vector-routing/test/nix-test.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/nix-vector-routing/test/nix-test.cc	2021-10-01 13:26:47.000000000 -0700
@@ -0,0 +1,383 @@
+/* -*- 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/test.h"
+#include "ns3/socket-factory.h"
+#include "ns3/udp-socket-factory.h"
+#include "ns3/simulator.h"
+#include "ns3/socket.h"
+
+#include "ns3/internet-stack-helper.h"
+#include "ns3/ipv4-address-helper.h"
+#include "ns3/ipv4-l3-protocol.h"
+#include "ns3/icmpv4-l4-protocol.h"
+#include "ns3/ipv6-address-helper.h"
+#include "ns3/ipv6-l3-protocol.h"
+#include "ns3/icmpv6-l4-protocol.h"
+#include "ns3/udp-l4-protocol.h"
+#include "ns3/simple-net-device-helper.h"
+#include "ns3/nix-vector-helper.h"
+
+using namespace ns3;
+/**
+ * \defgroup nix-vector-routing-test Nix-Vector Routing Tests
+ */
+
+/**
+ * \ingroup nix-vector-routing-test
+ * \ingroup tests
+ *
+ * The topology is of the form:
+ * \verbatim
+              __________
+             /          \
+    nSrc -- nA -- nB -- nC -- nDst
+   \endverbatim
+ *
+ * Following are the tests in this test case:
+ * - Test the routing from nSrc to nDst.
+ * - Test if the path taken is the shortest path.
+ * (Set down the interface of nA on nA-nC channel.)
+ * - Test if the NixCache and Ipv4RouteCache are empty.
+ * - Test the routing from nSrc to nDst again.
+ * - Test if the new shortest path is taken.
+ * (Set down the interface of nC on nB-nC channel.)
+ * - Test that routing is not possible from nSrc to nDst.
+ *
+ * \brief IPv4 Nix-Vector Routing Test
+ */
+class NixVectorRoutingTest : public TestCase
+{
+  Ptr<Packet> m_receivedPacket; //!< Received packet
+
+  /**
+   * \brief Send data immediately after being called.
+   * \param socket The sending socket.
+   * \param to IPv4 Destination address.
+   */
+  void DoSendDatav4 (Ptr<Socket> socket, Ipv4Address to);
+
+  /**
+   * \brief Send data immediately after being called.
+   * \param socket The sending socket.
+   * \param to IPv6 Destination address.
+   */
+  void DoSendDatav6 (Ptr<Socket> socket, Ipv6Address to);
+
+  /**
+   * \brief Schedules the DoSendData () function to send the data.
+   * \param delay The scheduled time to send data.
+   * \param socket The sending socket.
+   * \param to IPv4 Destination address.
+   */
+  void SendData (Time delay, Ptr<Socket> socket, Ipv4Address to);
+
+  /**
+   * \brief Schedules the DoSendData () function to send the data.
+   * \param delay The scheduled time to send data.
+   * \param socket The sending socket.
+   * \param to IPv6 Destination address.
+   */
+  void SendData (Time delay, Ptr<Socket> socket, Ipv6Address to);
+
+public:
+  virtual void DoRun (void);
+  NixVectorRoutingTest ();
+
+  /**
+   * \brief Receive data.
+   * \param socket The receiving socket.
+   */
+  void ReceivePkt (Ptr<Socket> socket);
+
+  std::vector<uint32_t> m_receivedPacketSizes; //!< Received packet sizes
+};
+
+NixVectorRoutingTest::NixVectorRoutingTest ()
+  : TestCase ("three router, two path test")
+{
+}
+
+void NixVectorRoutingTest::ReceivePkt (Ptr<Socket> socket)
+{
+  uint32_t availableData;
+  availableData = socket->GetRxAvailable ();
+  m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max (), 0);
+  NS_TEST_ASSERT_MSG_EQ (availableData, m_receivedPacket->GetSize (),
+                         "availableData should be equal to the size of packet received.");
+  NS_UNUSED (availableData);
+  m_receivedPacketSizes.push_back (m_receivedPacket->GetSize ());
+}
+
+void
+NixVectorRoutingTest::DoSendDatav4 (Ptr<Socket> socket, Ipv4Address to)
+{
+  Address realTo = InetSocketAddress (to, 1234);
+  socket->SendTo (Create<Packet> (123), 0, realTo);
+}
+
+void
+NixVectorRoutingTest::DoSendDatav6 (Ptr<Socket> socket, Ipv6Address to)
+{
+  Address realTo = Inet6SocketAddress (to, 1234);
+  socket->SendTo (Create<Packet> (123), 0, realTo);
+}
+
+void
+NixVectorRoutingTest::SendData (Time delay, Ptr<Socket> socket, Ipv4Address to)
+{
+  m_receivedPacket = Create<Packet> ();
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), delay,
+                                  &NixVectorRoutingTest::DoSendDatav4, this, socket, to);
+}
+
+void
+NixVectorRoutingTest::SendData (Time delay, Ptr<Socket> socket, Ipv6Address to)
+{
+  m_receivedPacket = Create<Packet> ();
+  Simulator::ScheduleWithContext (socket->GetNode ()->GetId (), delay,
+                                  &NixVectorRoutingTest::DoSendDatav6, this, socket, to);
+}
+
+void
+NixVectorRoutingTest::DoRun (void)
+{
+  // Create topology
+  NodeContainer nSrcnA;
+  NodeContainer nAnB;
+  NodeContainer nBnC;
+  NodeContainer nCnDst;
+  NodeContainer nAnC;
+
+  nSrcnA.Create (2);
+
+  nAnB.Add (nSrcnA.Get (1));
+  nAnB.Create (1);
+
+  nBnC.Add (nAnB.Get (1));
+  nBnC.Create (1);
+
+  nCnDst.Add (nBnC.Get (1));
+  nCnDst.Create (1);
+
+  nAnC.Add (nAnB.Get (0));
+  nAnC.Add (nCnDst.Get (0));
+
+  SimpleNetDeviceHelper devHelper;
+  devHelper.SetNetDevicePointToPointMode (true);
+
+  NodeContainer allNodes = NodeContainer (nSrcnA, nBnC, nCnDst.Get (1));
+
+  std::ostringstream stringStream1v4;
+  Ptr<OutputStreamWrapper> routingStream1v4 = Create<OutputStreamWrapper> (&stringStream1v4);
+  std::ostringstream stringStream1v6;
+  Ptr<OutputStreamWrapper> routingStream1v6 = Create<OutputStreamWrapper> (&stringStream1v6);
+  std::ostringstream stringStream2v4;
+  Ptr<OutputStreamWrapper> cacheStreamv4 = Create<OutputStreamWrapper> (&stringStream2v4);
+  std::ostringstream stringStream2v6;
+  Ptr<OutputStreamWrapper> cacheStreamv6 = Create<OutputStreamWrapper> (&stringStream2v6);
+  std::ostringstream stringStream3v4;
+  Ptr<OutputStreamWrapper> routingStream3v4 = Create<OutputStreamWrapper> (&stringStream3v4);
+  std::ostringstream stringStream3v6;
+  Ptr<OutputStreamWrapper> routingStream3v6 = Create<OutputStreamWrapper> (&stringStream3v6);
+
+  // NixHelper to install nix-vector routing on all nodes
+  Ipv4NixVectorHelper ipv4NixRouting;
+  Ipv6NixVectorHelper ipv6NixRouting;
+  InternetStackHelper stack;
+  stack.SetRoutingHelper (ipv4NixRouting); // has effect on the next Install ()
+  stack.SetRoutingHelper (ipv6NixRouting); // has effect on the next Install ()
+  stack.Install (allNodes);
+
+  NetDeviceContainer dSrcdA;
+  NetDeviceContainer dAdB;
+  NetDeviceContainer dBdC;
+  NetDeviceContainer dCdDst;
+  NetDeviceContainer dAdC;
+  dSrcdA = devHelper.Install (nSrcnA);
+  dAdB = devHelper.Install (nAnB);
+  dBdC = devHelper.Install (nBnC);
+  dCdDst = devHelper.Install (nCnDst);
+  dAdC = devHelper.Install (nAnC);
+
+  Ipv4AddressHelper aSrcaAv4;
+  aSrcaAv4.SetBase ("10.1.0.0", "255.255.255.0");
+  Ipv4AddressHelper aAaBv4;
+  aAaBv4.SetBase ("10.1.1.0", "255.255.255.0");
+  Ipv4AddressHelper aBaCv4;
+  aBaCv4.SetBase ("10.1.2.0", "255.255.255.0");
+  Ipv4AddressHelper aCaDstv4;
+  aCaDstv4.SetBase ("10.1.3.0", "255.255.255.0");
+  Ipv4AddressHelper aAaCv4;
+  aAaCv4.SetBase ("10.1.4.0", "255.255.255.0");
+
+  Ipv6AddressHelper aSrcaAv6;
+  aSrcaAv6.SetBase (Ipv6Address ("2001:0::"), Ipv6Prefix (64));
+  Ipv6AddressHelper aAaBv6;
+  aAaBv6.SetBase (Ipv6Address ("2001:1::"), Ipv6Prefix (64));
+  Ipv6AddressHelper aBaCv6;
+  aBaCv6.SetBase (Ipv6Address ("2001:2::"), Ipv6Prefix (64));
+  Ipv6AddressHelper aCaDstv6;
+  aCaDstv6.SetBase (Ipv6Address ("2001:3::"), Ipv6Prefix (64));
+  Ipv6AddressHelper aAaCv6;
+  aAaCv6.SetBase (Ipv6Address ("2001:4::"), Ipv6Prefix (64));
+
+  aSrcaAv4.Assign (dSrcdA);
+  aAaBv4.Assign (dAdB);
+  aBaCv4.Assign (dBdC);
+  Ipv4InterfaceContainer iCiDstv4 = aCaDstv4.Assign (dCdDst);
+  Ipv4InterfaceContainer iAiCv4 = aAaCv4.Assign (dAdC);
+
+  aSrcaAv6.Assign (dSrcdA);
+  aAaBv6.Assign (dAdB);
+  aBaCv6.Assign (dBdC);
+  Ipv6InterfaceContainer iCiDstv6 = aCaDstv6.Assign (dCdDst);
+  Ipv6InterfaceContainer iAiCv6 = aAaCv6.Assign (dAdC);
+
+  // Create the UDP sockets
+  Ptr<SocketFactory> rxSocketFactory = nCnDst.Get (1)->GetObject<UdpSocketFactory> ();
+  Ptr<Socket> rxSocketv4 = rxSocketFactory->CreateSocket ();
+  Ptr<Socket> rxSocketv6 = rxSocketFactory->CreateSocket ();
+  NS_TEST_EXPECT_MSG_EQ (rxSocketv4->Bind (InetSocketAddress (iCiDstv4.GetAddress (1), 1234)), 0, "trivial");
+  NS_TEST_EXPECT_MSG_EQ (rxSocketv6->Bind (Inet6SocketAddress (iCiDstv6.GetAddress (1, 1), 1234)), 0, "trivial");
+  rxSocketv4->SetRecvCallback (MakeCallback (&NixVectorRoutingTest::ReceivePkt, this));
+  rxSocketv6->SetRecvCallback (MakeCallback (&NixVectorRoutingTest::ReceivePkt, this));
+
+  Ptr<SocketFactory> txSocketFactory = nSrcnA.Get (0)->GetObject<UdpSocketFactory> ();
+  Ptr<Socket> txSocket = txSocketFactory->CreateSocket ();
+  txSocket->SetAllowBroadcast (true);
+
+  SendData (Seconds (2), txSocket, Ipv4Address ("10.1.3.2"));
+  SendData (Seconds (2), txSocket, Ipv6Address ("2001:3::200:ff:fe00:8"));
+
+  ipv4NixRouting.PrintRoutingPathAt (Seconds (3), nSrcnA.Get (0), iCiDstv4.GetAddress (1), routingStream1v4);
+  ipv6NixRouting.PrintRoutingPathAt (Seconds (3), nSrcnA.Get (0), iCiDstv6.GetAddress (1, 1), routingStream1v6);
+
+  // Set the IPv4 nA interface on nA - nC channel down.
+  Ptr<Ipv4> ipv4 = nAnC.Get (0)->GetObject<Ipv4> ();
+  int32_t ifIndex = ipv4->GetInterfaceForDevice (dAdC.Get (0));
+  Simulator::Schedule (Seconds (5), &Ipv4::SetDown, ipv4, ifIndex);
+
+  // Set the IPv6 nA interface on nA - nC channel down.
+  Ptr<Ipv6> ipv6 = nAnC.Get (0)->GetObject<Ipv6> ();
+  ifIndex = ipv6->GetInterfaceForDevice (dAdC.Get (0));
+  Simulator::Schedule (Seconds (5), &Ipv6::SetDown, ipv6, ifIndex);
+
+  ipv4NixRouting.PrintRoutingTableAllAt (Seconds (7), cacheStreamv4);
+  ipv6NixRouting.PrintRoutingTableAllAt (Seconds (7), cacheStreamv6);
+
+  SendData (Seconds (8), txSocket, Ipv4Address ("10.1.3.2"));
+  SendData (Seconds (8), txSocket, Ipv6Address ("2001:3::200:ff:fe00:8"));
+
+  ipv4NixRouting.PrintRoutingPathAt (Seconds (9), nSrcnA.Get (0), iCiDstv4.GetAddress (1), routingStream3v4);
+  ipv6NixRouting.PrintRoutingPathAt (Seconds (9), nSrcnA.Get (0), iCiDstv6.GetAddress (1, 1), routingStream3v6);
+
+  // Set the IPv4 nC interface on nB - nC channel down.
+  ipv4 = nBnC.Get (1)->GetObject<Ipv4> ();
+  ifIndex = ipv4->GetInterfaceForDevice (dBdC.Get (1));
+  Simulator::Schedule (Seconds (10), &Ipv4::SetDown, ipv4, ifIndex);
+
+  // Set the IPv6 nC interface on nB - nC channel down.
+  ipv6 = nBnC.Get (1)->GetObject<Ipv6> ();
+  ifIndex = ipv6->GetInterfaceForDevice (dBdC.Get (1));
+  Simulator::Schedule (Seconds (10), &Ipv6::SetDown, ipv6, ifIndex);
+
+  SendData (Seconds (11), txSocket, Ipv4Address ("10.1.3.2"));
+  SendData (Seconds (11), txSocket, Ipv6Address ("2001:3::200:ff:fe00:8"));
+
+  Simulator::Stop (Seconds (66));
+  Simulator::Run ();
+
+  // ------ Now the tests ------------
+
+  // Test the Routing
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacketSizes[0], 123, "IPv4 Nix-Vector Routing should work.");
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacketSizes[1], 123, "IPv6 Nix-Vector Routing should work.");
+  NS_TEST_EXPECT_MSG_EQ (m_receivedPacketSizes.size (), 4, "IPv4 and IPv6 Nix-Vector Routing should have received only 1 packet.");
+
+  // Test the Path
+  const std::string p_nSrcnAnCnDstv4 = "Time: +3s, Nix Routing\n"
+                                              "Route Path: (Node 0 to Node 4, Nix Vector: 01001)\n"
+                                              "10.1.0.1                 (Node 0)  ---->   10.1.0.2                 (Node 1)\n"
+                                              "10.1.4.1                 (Node 1)  ---->   10.1.4.2                 (Node 3)\n"
+                                              "10.1.3.1                 (Node 3)  ---->   10.1.3.2                 (Node 4)\n\n";
+  NS_TEST_EXPECT_MSG_EQ (stringStream1v4.str (), p_nSrcnAnCnDstv4, "Routing Path is incorrect.");
+
+  const std::string p_nSrcnAnCnDstv6 = "Time: +3s, Nix Routing\n"
+                                              "Route Path: (Node 0 to Node 4, Nix Vector: 01001)\n"
+                                              "2001::200:ff:fe00:1      (Node 0)  ---->   fe80::200:ff:fe00:2      (Node 1)\n"
+                                              "fe80::200:ff:fe00:9      (Node 1)  ---->   fe80::200:ff:fe00:a      (Node 3)\n"
+                                              "fe80::200:ff:fe00:7      (Node 3)  ---->   2001:3::200:ff:fe00:8    (Node 4)\n\n";
+  NS_TEST_EXPECT_MSG_EQ (stringStream1v6.str (), p_nSrcnAnCnDstv6, "Routing Path is incorrect.");
+
+  const std::string p_nSrcnAnBnCnDstv4 = "Time: +9s, Nix Routing\n"
+                                                 "Route Path: (Node 0 to Node 4, Nix Vector: 0111)\n"
+                                                 "10.1.0.1                 (Node 0)  ---->   10.1.0.2                 (Node 1)\n"
+                                                 "10.1.1.1                 (Node 1)  ---->   10.1.1.2                 (Node 2)\n"
+                                                 "10.1.2.1                 (Node 2)  ---->   10.1.2.2                 (Node 3)\n"
+                                                 "10.1.3.1                 (Node 3)  ---->   10.1.3.2                 (Node 4)\n\n";
+  NS_TEST_EXPECT_MSG_EQ (stringStream3v4.str (), p_nSrcnAnBnCnDstv4, "Routing Path is incorrect.");
+
+  const std::string p_nSrcnAnBnCnDstv6 = "Time: +9s, Nix Routing\n"
+                                                 "Route Path: (Node 0 to Node 4, Nix Vector: 0111)\n"
+                                                 "2001::200:ff:fe00:1      (Node 0)  ---->   fe80::200:ff:fe00:2      (Node 1)\n"
+                                                 "fe80::200:ff:fe00:3      (Node 1)  ---->   fe80::200:ff:fe00:4      (Node 2)\n"
+                                                 "fe80::200:ff:fe00:5      (Node 2)  ---->   fe80::200:ff:fe00:6      (Node 3)\n"
+                                                 "fe80::200:ff:fe00:7      (Node 3)  ---->   2001:3::200:ff:fe00:8    (Node 4)\n\n";
+  NS_TEST_EXPECT_MSG_EQ (stringStream3v6.str (), p_nSrcnAnBnCnDstv6, "Routing Path is incorrect.");
+
+  const std::string emptyCaches = "Node: 0, Time: +7s, Local time: +7s, Nix Routing\n"
+                                  "NixCache:\n"
+                                  "IpRouteCache:\n\n"
+                                  "Node: 1, Time: +7s, Local time: +7s, Nix Routing\n"
+                                  "NixCache:\n"
+                                  "IpRouteCache:\n\n"
+                                  "Node: 2, Time: +7s, Local time: +7s, Nix Routing\n"
+                                  "NixCache:\n"
+                                  "IpRouteCache:\n\n"
+                                  "Node: 3, Time: +7s, Local time: +7s, Nix Routing\n"
+                                  "NixCache:\n"
+                                  "IpRouteCache:\n\n"
+                                  "Node: 4, Time: +7s, Local time: +7s, Nix Routing\n"
+                                  "NixCache:\n"
+                                  "IpRouteCache:\n\n";
+  NS_TEST_EXPECT_MSG_EQ (stringStream2v4.str (), emptyCaches, "The caches should have been empty.");
+  NS_TEST_EXPECT_MSG_EQ (stringStream2v6.str (), emptyCaches, "The caches should have been empty.");
+  
+  Simulator::Destroy ();
+}
+
+/**
+ * \ingroup nix-vector-routing-test
+ * \ingroup tests
+ *
+ * \brief IPv4 Nix-Vector Routing TestSuite
+ */
+class NixVectorRoutingTestSuite : public TestSuite
+{
+public:
+  NixVectorRoutingTestSuite () : TestSuite ("nix-vector-routing", UNIT)
+  {
+    AddTestCase (new NixVectorRoutingTest (), TestCase::QUICK);
+  }
+};
+
+/// Static variable for test initialization
+static NixVectorRoutingTestSuite g_nixVectorRoutingTestSuite;
\ No newline at end of file
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/nix-vector-routing/wscript ns-3.35/src/nix-vector-routing/wscript
--- ns-3.34/src/nix-vector-routing/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/nix-vector-routing/wscript	2021-10-01 13:26:47.000000000 -0700
@@ -4,13 +4,22 @@
     module = bld.create_ns3_module('nix-vector-routing', ['internet'])
     module.includes = '.'
     module.source = [
-        'model/ipv4-nix-vector-routing.cc',
-        'helper/ipv4-nix-vector-helper.cc',
+        'model/nix-vector-routing.cc',
+        'helper/nix-vector-helper.cc',
         ]
 
+    nix_vector_test = bld.create_ns3_module_test_library('nix-vector-routing')
+    nix_vector_test.source = [
+        'test/nix-test.cc',
+    ]
+
     headers = bld(features='ns3header')
     headers.module = 'nix-vector-routing'
     headers.source = [
+        'model/nix-vector-routing.h',
+        'helper/nix-vector-helper.h',
+        ]
+    headers.deprecated = [
         'model/ipv4-nix-vector-routing.h',
         'helper/ipv4-nix-vector-helper.h',
         ]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/olsr/bindings/modulegen__gcc_ILP32.py ns-3.35/src/olsr/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/olsr/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/olsr/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1740,11 +1740,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1817,6 +1812,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1837,11 +1837,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1910,11 +1919,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2088,11 +2092,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2285,11 +2284,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/olsr/bindings/modulegen__gcc_LP64.py ns-3.35/src/olsr/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/olsr/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/olsr/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1740,11 +1740,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1817,6 +1812,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1837,11 +1837,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1910,11 +1919,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2088,11 +2092,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2285,11 +2284,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/point-to-point/bindings/modulegen__gcc_ILP32.py ns-3.35/src/point-to-point/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/point-to-point/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1666,11 +1666,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1775,11 +1770,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1896,11 +1886,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2093,11 +2078,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/point-to-point/bindings/modulegen__gcc_LP64.py ns-3.35/src/point-to-point/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/point-to-point/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/point-to-point/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1666,11 +1666,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1775,11 +1770,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1896,11 +1886,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2093,11 +2078,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:47.000000000 -0700
@@ -1815,11 +1815,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1917,6 +1912,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1937,11 +1937,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2062,11 +2071,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2183,11 +2187,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2568,11 +2567,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4667,11 +4661,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4712,11 +4711,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4737,10 +4741,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4765,10 +4774,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/point-to-point-layout/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:47.000000000 -0700
@@ -1815,11 +1815,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1917,6 +1912,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1937,11 +1937,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -2062,11 +2071,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2183,11 +2187,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2568,11 +2567,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4667,11 +4661,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -4712,11 +4711,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -4737,10 +4741,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -4765,10 +4774,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/propagation/bindings/modulegen__gcc_ILP32.py ns-3.35/src/propagation/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/propagation/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/propagation/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1292,6 +1292,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -1319,6 +1324,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -3247,6 +3257,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -3281,6 +3296,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/propagation/bindings/modulegen__gcc_LP64.py ns-3.35/src/propagation/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/propagation/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/propagation/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1292,6 +1292,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -1319,6 +1324,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -3247,6 +3257,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -3281,6 +3296,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/sixlowpan/bindings/modulegen__gcc_ILP32.py ns-3.35/src/sixlowpan/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/sixlowpan/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1326,11 +1326,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1435,11 +1430,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1556,11 +1546,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1753,11 +1738,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/sixlowpan/bindings/modulegen__gcc_LP64.py ns-3.35/src/sixlowpan/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/sixlowpan/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1326,11 +1326,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1435,11 +1430,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1556,11 +1546,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1753,11 +1738,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/sixlowpan/model/sixlowpan-net-device.cc ns-3.35/src/sixlowpan/model/sixlowpan-net-device.cc
--- ns-3.34/src/sixlowpan/model/sixlowpan-net-device.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/sixlowpan/model/sixlowpan-net-device.cc	2021-10-01 13:26:48.000000000 -0700
@@ -731,7 +731,7 @@
 
       uint8_t bufOne[16];
       uint8_t bufTwo[16];
-      Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
+      Ipv6Address srcAddr = ipHeader.GetSource ();
       srcAddr.GetBytes (bufOne);
       Ipv6Address mySrcAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src);
 
@@ -761,7 +761,7 @@
           hc1Header.SetSrcPrefix (bufOne);
         }
 
-      Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
+      Ipv6Address dstAddr = ipHeader.GetDestination ();
       dstAddr.GetBytes (bufOne);
       Ipv6Address myDstAddr = Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst);
 
@@ -847,7 +847,7 @@
           address[j + 8] = interface[j];
           address[j] = prefix[j];
         }
-      ipHeader.SetSourceAddress ( Ipv6Address (address) );
+      ipHeader.SetSource ( Ipv6Address (address) );
       break;
     case SixLowPanHc1::HC1_PIIC:
       prefix = encoding.GetSrcPrefix ();
@@ -856,7 +856,7 @@
           address[j + 8] = 0;
           address[j] = prefix[j];
         }
-      ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredAddress (src, Ipv6Address (address)));
+      ipHeader.SetSource (Ipv6Address::MakeAutoconfiguredAddress (src, Ipv6Address (address)));
       break;
     case SixLowPanHc1::HC1_PCII:
       interface = encoding.GetSrcInterface ();
@@ -866,10 +866,10 @@
         {
           address[j + 8] = interface[j];
         }
-      ipHeader.SetSourceAddress ( Ipv6Address (address) );
+      ipHeader.SetSource ( Ipv6Address (address) );
       break;
     case SixLowPanHc1::HC1_PCIC:
-      ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
+      ipHeader.SetSource (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
       break;
     }
 
@@ -887,7 +887,7 @@
           address[j + 8] = interface[j];
           address[j] = prefix[j];
         }
-      ipHeader.SetDestinationAddress ( Ipv6Address (address) );
+      ipHeader.SetDestination ( Ipv6Address (address) );
       break;
     case SixLowPanHc1::HC1_PIIC:
       prefix = encoding.GetDstPrefix ();
@@ -896,7 +896,7 @@
           address[j + 8] = 0;
           address[j] = prefix[j];
         }
-      ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredAddress (dst, Ipv6Address (address)));
+      ipHeader.SetDestination (Ipv6Address::MakeAutoconfiguredAddress (dst, Ipv6Address (address)));
       break;
     case SixLowPanHc1::HC1_PCII:
       interface = encoding.GetDstInterface ();
@@ -906,10 +906,10 @@
         {
           address[j + 8] = interface[j];
         }
-      ipHeader.SetDestinationAddress ( Ipv6Address (address) );
+      ipHeader.SetDestination ( Ipv6Address (address) );
       break;
     case SixLowPanHc1::HC1_PCIC:
-      ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
+      ipHeader.SetDestination (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
       break;
     }
 
@@ -1048,7 +1048,7 @@
       // This is just to limit the scope of some variables.
       if (true)
         {
-          Ipv6Address srcAddr = ipHeader.GetSourceAddress ();
+          Ipv6Address srcAddr = ipHeader.GetSource ();
           uint8_t srcContextId;
 
           // The "::" address is compressed as a fake stateful compression.
@@ -1132,7 +1132,7 @@
         }
 
       // Set the M field
-      if (ipHeader.GetDestinationAddress ().IsMulticast ())
+      if (ipHeader.GetDestination ().IsMulticast ())
         {
           iphcHeader.SetM (true);
         }
@@ -1144,7 +1144,7 @@
       // This is just to limit the scope of some variables.
       if (true)
         {
-          Ipv6Address dstAddr = ipHeader.GetDestinationAddress ();
+          Ipv6Address dstAddr = ipHeader.GetDestination ();
           dstAddr.GetBytes (addressBuf);
 
           NS_LOG_LOGIC ("Checking destination compression: " << dstAddr );
@@ -1348,7 +1348,7 @@
       // Source address compression uses stateful, context-based compression.
       if ( encoding.GetSam () == SixLowPanIphc::HC_INLINE )
         {
-          ipHeader.SetSourceAddress ( Ipv6Address::GetAny () );
+          ipHeader.SetSource ( Ipv6Address::GetAny () );
         }
       else
         {
@@ -1398,7 +1398,7 @@
               uint8_t prefixBitMask = ~addressBitMask;
               srcAddress[bytesToCopy] = (contexPrefix[bytesToCopy] & prefixBitMask) | (srcAddress[bytesToCopy] & addressBitMask);
             }
-          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
+          ipHeader.SetSource ( Ipv6Address::Deserialize (srcAddress) );
         }
     }
   else
@@ -1409,7 +1409,7 @@
         {
           uint8_t srcAddress[16] = { };
           memcpy (srcAddress, encoding.GetSrcInlinePart (), 16);
-          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
+          ipHeader.SetSource ( Ipv6Address::Deserialize (srcAddress) );
         }
       else if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_64 )
         {
@@ -1417,7 +1417,7 @@
           memcpy (srcAddress +8, encoding.GetSrcInlinePart (), 8);
           srcAddress[0] = 0xfe;
           srcAddress[1] = 0x80;
-          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
+          ipHeader.SetSource ( Ipv6Address::Deserialize (srcAddress) );
         }
       else if ( encoding.GetSam () == SixLowPanIphc::HC_COMPR_16 )
         {
@@ -1427,11 +1427,11 @@
           srcAddress[1] = 0x80;
           srcAddress[11] = 0xff;
           srcAddress[12] = 0xfe;
-          ipHeader.SetSourceAddress ( Ipv6Address::Deserialize (srcAddress) );
+          ipHeader.SetSource ( Ipv6Address::Deserialize (srcAddress) );
         }
       else // SixLowPanIphc::HC_COMPR_0
         {
-          ipHeader.SetSourceAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
+          ipHeader.SetSource (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (src));
         }
     }
   // Destination address
@@ -1495,7 +1495,7 @@
               uint8_t prefixBitMask = ~addressBitMask;
               dstAddress[bytesToCopy] = (contexPrefix[bytesToCopy] & prefixBitMask) | (dstAddress[bytesToCopy] & addressBitMask);
             }
-          ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+          ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
         }
       else
         {
@@ -1507,7 +1507,7 @@
           dstAddress[3] = contextLength;
           memcpy (dstAddress +4, contexPrefix, 8);
           memcpy (dstAddress +12, encoding.GetDstInlinePart ()+2, 4);
-          ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+          ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
         }
     }
   else
@@ -1520,7 +1520,7 @@
              {
                uint8_t dstAddress[16] = { };
                memcpy (dstAddress, encoding.GetDstInlinePart (), 16);
-               ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+               ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
              }
           else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_64 )
             {
@@ -1528,7 +1528,7 @@
               memcpy (dstAddress +8, encoding.GetDstInlinePart (), 8);
               dstAddress[0] = 0xfe;
               dstAddress[1] = 0x80;
-              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+              ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
             }
           else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_16 )
             {
@@ -1538,11 +1538,11 @@
               dstAddress[1] = 0x80;
               dstAddress[11] = 0xff;
               dstAddress[12] = 0xfe;
-              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+              ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
             }
           else // SixLowPanIphc::HC_COMPR_0
             {
-              ipHeader.SetDestinationAddress (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
+              ipHeader.SetDestination (Ipv6Address::MakeAutoconfiguredLinkLocalAddress (dst));
             }
          }
       else
@@ -1552,7 +1552,7 @@
             {
               uint8_t dstAddress[16] = { };
               memcpy (dstAddress, encoding.GetDstInlinePart (), 16);
-              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+              ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
             }
           else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_64 )
             {
@@ -1560,7 +1560,7 @@
               dstAddress[0] = 0xff;
               memcpy (dstAddress +1, encoding.GetDstInlinePart (), 1);
               memcpy (dstAddress +11, encoding.GetDstInlinePart ()+1, 5);
-              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+              ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
             }
           else if ( encoding.GetDam () == SixLowPanIphc::HC_COMPR_16 )
             {
@@ -1568,7 +1568,7 @@
               dstAddress[0] = 0xff;
               memcpy (dstAddress +1, encoding.GetDstInlinePart (), 1);
               memcpy (dstAddress +13, encoding.GetDstInlinePart ()+1, 3);
-              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+              ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
             }
           else // SixLowPanIphc::HC_COMPR_0
             {
@@ -1576,7 +1576,7 @@
               dstAddress[0] = 0xff;
               dstAddress[1] = 0x02;
               memcpy (dstAddress+15, encoding.GetDstInlinePart (), 1);
-              ipHeader.SetDestinationAddress ( Ipv6Address::Deserialize (dstAddress) );
+              ipHeader.SetDestination ( Ipv6Address::Deserialize (dstAddress) );
             }
         }
     }
@@ -1621,11 +1621,11 @@
       if (dispatchVal == SixLowPanDispatch::LOWPAN_UDPNHC)
         {
           ipHeader.SetNextHeader (Ipv6Header::IPV6_UDP);
-          DecompressLowPanUdpNhc (packet, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress ());
+          DecompressLowPanUdpNhc (packet, ipHeader.GetSource (), ipHeader.GetDestination ());
         }
       else
         {
-          std::pair <uint8_t, bool> retval = DecompressLowPanNhc (packet, src, dst, ipHeader.GetSourceAddress (), ipHeader.GetDestinationAddress ());
+          std::pair <uint8_t, bool> retval = DecompressLowPanNhc (packet, src, dst, ipHeader.GetSource (), ipHeader.GetDestination ());
           if ( retval.second == true )
             {
               return true;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc ns-3.35/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc
--- ns-3.34/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/sixlowpan/test/sixlowpan-iphc-stateful-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -154,8 +154,8 @@
 {
   Ptr<Packet> pkt = Create<Packet> (10);
   Ipv6Header ipHdr;
-  ipHdr.SetSourceAddress (from);
-  ipHdr.SetDestinationAddress (to);
+  ipHdr.SetSource (from);
+  ipHdr.SetDestination (to);
   ipHdr.SetHopLimit (64);
   ipHdr.SetPayloadLength (10);
   ipHdr.SetNextHeader (0xff);
@@ -261,8 +261,8 @@
 
   // 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");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSource (), Ipv6Address::GetAny (), "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestination (), 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);
@@ -277,8 +277,8 @@
 
   // 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");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSource (), Ipv6Address ("2001:2::f00d:f00d:cafe:cafe"), "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestination (), 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);
@@ -293,8 +293,8 @@
 
   // 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");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSource (), Ipv6Address ("2001:1::0000:00ff:fe00:cafe"), "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestination (), 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);
@@ -309,8 +309,8 @@
 
   // 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");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetSource (), srcElided, "Src address wrongly rebuilt");
+  NS_TEST_EXPECT_MSG_EQ (ipv6Hdr.GetDestination (), Ipv6Address ("2001:1::f00d:f00d:cafe:cafe"), "Dst address wrongly rebuilt");
 
   m_rxPackets.clear ();
   m_txPackets.clear ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/bindings/modulegen__gcc_ILP32.py ns-3.35/src/spectrum/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/spectrum/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -662,7 +662,7 @@
     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< 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< ns3::BandInfo >', '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')
@@ -2041,11 +2041,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2150,11 +2145,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2271,11 +2261,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2468,11 +2453,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4043,6 +4023,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -4070,6 +4055,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -4201,6 +4191,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -4988,10 +4983,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -7445,6 +7440,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -7479,6 +7479,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/bindings/modulegen__gcc_LP64.py ns-3.35/src/spectrum/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/spectrum/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -662,7 +662,7 @@
     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< 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< ns3::BandInfo >', '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')
@@ -2041,11 +2041,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2150,11 +2145,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2271,11 +2261,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2468,11 +2453,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -4043,6 +4023,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -4070,6 +4055,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -4201,6 +4191,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -4988,10 +4983,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -7445,6 +7440,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -7479,6 +7479,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/model/spectrum-model.cc ns-3.35/src/spectrum/model/spectrum-model.cc
--- ns-3.34/src/spectrum/model/spectrum-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/model/spectrum-model.cc	2021-10-01 13:26:48.000000000 -0700
@@ -38,7 +38,7 @@
 
 SpectrumModelUid_t SpectrumModel::m_uidCount = 0;
 
-SpectrumModel::SpectrumModel (std::vector<double> centerFreqs)
+SpectrumModel::SpectrumModel (const std::vector<double>& centerFreqs)
 {
   NS_ASSERT (centerFreqs.size () > 1);
   m_uid = ++m_uidCount;
@@ -70,13 +70,20 @@
     }
 }
 
-SpectrumModel::SpectrumModel (Bands bands)
+SpectrumModel::SpectrumModel (const Bands& bands)
 {
   m_uid = ++m_uidCount;
   NS_LOG_INFO ("creating new SpectrumModel, m_uid=" << m_uid);
   m_bands = bands;
 }
 
+SpectrumModel::SpectrumModel (Bands&& bands)
+  : m_bands (std::move (bands))
+{
+  m_uid = ++m_uidCount;
+  NS_LOG_INFO ("creating new SpectrumModel, m_uid=" << m_uid);
+}
+
 Bands::const_iterator
 SpectrumModel::Begin () const
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/model/spectrum-model.h ns-3.35/src/spectrum/model/spectrum-model.h
--- ns-3.34/src/spectrum/model/spectrum-model.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/model/spectrum-model.h	2021-10-01 13:26:48.000000000 -0700
@@ -82,21 +82,26 @@
    * center frequency of the adjacent lower (resp. upper) band.
    *
    * @param centerFreqs the vector of center frequencies.
-   *
-   * @return
    */
-  SpectrumModel (std::vector<double> centerFreqs);
+  SpectrumModel (const std::vector<double>& centerFreqs);
 
 
   /**
-   * This construct a SpectrumModel based on the explicit values of
+   * This constructs a SpectrumModel based on the explicit values of
    * center frequencies and boundaries of each subband.
    *
-   * @param bands
+   * @param bands the vector of bands for this model
+   */
+  SpectrumModel (const Bands& bands);
+
+  /**
+   * This constructs a SpectrumModel based on the explicit values of
+   * center frequencies and boundaries of each subband. This is used
+   * if <i>bands</i> is an rvalue.
    *
-   * @return
+   * @param bands the vector of bands for this model
    */
-  SpectrumModel (Bands bands);
+  SpectrumModel (Bands&& bands);
 
   /**
    *
@@ -113,10 +118,14 @@
 
   /**
    * Const Iterator to the model Bands container start.
+   *
+   * @return a const iterator to the start of the vector of bands
    */
   Bands::const_iterator Begin () const;
   /**
    * Const Iterator to the model Bands container end.
+   *
+   * @return a const iterator to past-the-end of the vector of bands
    */
   Bands::const_iterator End () const;
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/model/three-gpp-channel-model.cc ns-3.35/src/spectrum/model/three-gpp-channel-model.cc
--- ns-3.34/src/spectrum/model/three-gpp-channel-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/model/three-gpp-channel-model.cc	2021-10-01 13:26:48.000000000 -0700
@@ -179,8 +179,12 @@
 void
 ThreeGppChannelModel::DoDispose ()
 {
+  NS_LOG_FUNCTION (this);
   m_channelMap.clear ();
-  m_channelConditionModel->Dispose ();
+  if (m_channelConditionModel)
+    {
+      m_channelConditionModel->Dispose ();
+    }
   m_channelConditionModel = nullptr;
 }
 
@@ -1551,7 +1555,8 @@
 
           for (uint8_t nIndex = 0; nIndex < numReducedCluster; nIndex++)
             {
-              //Compute the N-2 weakest cluster, only vertical polarization. (7.5-22)
+              //Compute the N-2 weakest cluster, assuming 0 slant angle and a
+              //polarization slant angle configured in the array (7.5-22)
               if (nIndex != cluster1st && nIndex != cluster2nd)
                 {
                   std::complex<double> rays (0,0);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.cc ns-3.35/src/spectrum/model/wifi-spectrum-value-helper.cc
--- ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/model/wifi-spectrum-value-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -124,7 +124,7 @@
           NS_LOG_DEBUG ("creating band " << i << " (" << info.fl << ":" << info.fc << ":" << info.fh << ")");
           bands.push_back (info);
         }
-      ret = Create<SpectrumModel> (bands);
+      ret = Create<SpectrumModel> (std::move (bands));
       g_wifiSpectrumModelMap.insert (std::pair<WifiSpectrumModelId, Ptr<SpectrumModel> > (key, ret));
     }
   NS_LOG_LOGIC ("returning SpectrumModel::GetUid () == " << ret->GetUid ());
@@ -640,6 +640,21 @@
   return std::pow (10.0, 0.1 * (dBm - 30.0));
 }
 
+double
+WifiSpectrumValueHelper::GetBandPowerW (Ptr<SpectrumValue> psd, const WifiSpectrumBand &band)
+{
+    double powerWattPerHertz = 0.0;
+    auto valueIt = psd->ConstValuesBegin() + band.first;
+    auto end = psd->ConstValuesBegin() + band.second;
+    auto bandIt = psd->ConstBandsBegin() + band.first;
+    while (valueIt <= end)
+    {
+        powerWattPerHertz += *valueIt;
+        ++valueIt;
+    }
+    return powerWattPerHertz * (bandIt->fh - bandIt->fl);
+}
+
 static Ptr<SpectrumModel> g_WifiSpectrumModel5Mhz; ///< static initializer for the class
 
 WifiSpectrumValueHelper::~WifiSpectrumValueHelper ()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.h ns-3.35/src/spectrum/model/wifi-spectrum-value-helper.h
--- ns-3.34/src/spectrum/model/wifi-spectrum-value-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/spectrum/model/wifi-spectrum-value-helper.h	2021-10-01 13:26:48.000000000 -0700
@@ -215,7 +215,6 @@
    * \param minInnerBandDbr the minimum relative power in the inner band (i.e. -20 dBr in the figure above)
    * \param minOuterbandDbr the minimum relative power in the outer band (i.e. -28 dBr in the figure above)
    * \param lowestPointDbr maximum relative power of the outermost subcarriers of the guard band (in dBr)
-   * \return a pointer to a newly allocated SpectrumValue representing the HT OFDM Transmit Power Spectral Density in W/Hz for each Band
    */
   static void CreateSpectrumMaskForOfdm (Ptr<SpectrumValue> c, std::vector <WifiSpectrumBand> allocatedSubBands, WifiSpectrumBand maskBand,
                                          double txPowerPerBandW, uint32_t nGuardBands, uint32_t innerSlopeWidth,
@@ -240,6 +239,16 @@
    * \return the equivalent Watts for the given dBm
    */
   static double DbmToW (double dbm);
+
+  /**
+   * Calculate the power of the specified band composed of uniformly-sized sub-bands.
+   *
+   * \param psd received Power Spectral Density in W/Hz
+   * \param band a pair of start and stop indexes that defines the band
+   *
+   * \return band power in W
+   */
+  static double GetBandPowerW (Ptr<SpectrumValue> psd, const WifiSpectrumBand &band);
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/tap-bridge/bindings/modulegen__gcc_ILP32.py ns-3.35/src/tap-bridge/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/tap-bridge/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1341,11 +1341,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1450,11 +1445,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1571,11 +1561,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1768,11 +1753,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/tap-bridge/bindings/modulegen__gcc_LP64.py ns-3.35/src/tap-bridge/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/tap-bridge/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1341,11 +1341,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1450,11 +1445,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1571,11 +1561,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1768,11 +1753,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/topology-read/bindings/modulegen__gcc_ILP32.py ns-3.35/src/topology-read/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/topology-read/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/topology-read/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1124,11 +1124,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1233,11 +1228,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1354,11 +1344,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1551,11 +1536,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/topology-read/bindings/modulegen__gcc_LP64.py ns-3.35/src/topology-read/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/topology-read/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/topology-read/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1124,11 +1124,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1233,11 +1228,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1354,11 +1344,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1551,11 +1536,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/topology-read/examples/topology-example-sim.cc ns-3.35/src/topology-read/examples/topology-example-sim.cc
--- ns-3.34/src/topology-read/examples/topology-example-sim.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/topology-read/examples/topology-example-sim.cc	2021-10-01 13:26:48.000000000 -0700
@@ -31,7 +31,7 @@
 #include "ns3/internet-module.h"
 #include "ns3/point-to-point-module.h"
 #include "ns3/applications-module.h"
-#include "ns3/ipv4-nix-vector-helper.h"
+#include "ns3/nix-vector-helper.h"
 
 #include "ns3/topology-read-module.h"
 #include <list>
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/traffic-control/bindings/modulegen__gcc_ILP32.py ns-3.35/src/traffic-control/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/traffic-control/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/traffic-control/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1692,11 +1692,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1801,11 +1796,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1922,11 +1912,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2119,11 +2104,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/traffic-control/bindings/modulegen__gcc_LP64.py ns-3.35/src/traffic-control/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/traffic-control/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/traffic-control/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1692,11 +1692,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1801,11 +1796,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1922,11 +1912,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2119,11 +2104,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/traffic-control/model/fq-pie-queue-disc.cc ns-3.35/src/traffic-control/model/fq-pie-queue-disc.cc
--- ns-3.34/src/traffic-control/model/fq-pie-queue-disc.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/traffic-control/model/fq-pie-queue-disc.cc	2021-10-01 13:26:48.000000000 -0700
@@ -512,17 +512,17 @@
 
   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));
+  m_queueDiscFactory.Set ("MeanPktSize", UintegerValue(m_meanPktSize));
+  m_queueDiscFactory.Set ("A", DoubleValue (m_a));
+  m_queueDiscFactory.Set ("B", DoubleValue (m_b));
+  m_queueDiscFactory.Set ("Tupdate", TimeValue (m_tUpdate));
+  m_queueDiscFactory.Set ("Supdate", TimeValue (m_sUpdate));
+  m_queueDiscFactory.Set ("DequeueThreshold", UintegerValue (m_dqThreshold));
+  m_queueDiscFactory.Set ("QueueDelayReference", TimeValue (m_qDelayRef));
+  m_queueDiscFactory.Set ("MaxBurstAllowance", TimeValue (m_maxBurst));
+  m_queueDiscFactory.Set ("UseDequeueRateEstimator", BooleanValue (m_useDqRateEstimator));
+  m_queueDiscFactory.Set ("UseCapDropAdjustment", BooleanValue (m_isCapDropAdjustment));
+  m_queueDiscFactory.Set ("UseDerandomization", BooleanValue (m_useDerandomization));
 }
 
 uint32_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/traffic-control/model/tbf-queue-disc.cc ns-3.35/src/traffic-control/model/tbf-queue-disc.cc
--- ns-3.34/src/traffic-control/model/tbf-queue-disc.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/traffic-control/model/tbf-queue-disc.cc	2021-10-01 13:26:48.000000000 -0700
@@ -254,16 +254,38 @@
         }
 
       // the watchdog timer setup.
-      /* A packet gets blocked if the above if condition is not satisfied, i.e.
-      both the ptoks and btoks are less than zero. In that case we have to 
-      schedule the waking of queue when enough tokens are available. */
+      // A packet gets blocked if the above if() condition is not satisfied:
+      // either or both btoks and ptoks are negative.  In that case, we have
+      // to schedule the waking of queue when enough tokens are available.
       if (m_id.IsExpired () == true)
         {
-          Time requiredDelayTime = std::max (m_rate.CalculateBytesTxTime (-btoks),
-                                             m_peakRate.CalculateBytesTxTime (-ptoks));
+          NS_ASSERT_MSG (m_rate.GetBitRate () > 0, "Rate must be positive");
+          Time requiredDelayTime;
+          if (m_peakRate.GetBitRate () == 0)
+            {
+              NS_ASSERT_MSG (btoks < 0, "Logic error; btoks must be < 0 here");
+              requiredDelayTime = m_rate.CalculateBytesTxTime (-btoks);
+            }
+          else
+            {
+              if (btoks < 0 && ptoks >= 0)
+                {
+                  requiredDelayTime = m_rate.CalculateBytesTxTime (-btoks);
+                }
+              else if (btoks >= 0 && ptoks < 0)
+                {
+                  requiredDelayTime = m_peakRate.CalculateBytesTxTime (-ptoks);
+                }
+              else
+                {
+                  requiredDelayTime = std::max (m_rate.CalculateBytesTxTime (-btoks),
+                                                m_peakRate.CalculateBytesTxTime (-ptoks));
+                }
 
+            }
+          NS_ASSERT_MSG (requiredDelayTime.GetSeconds () >= 0, "Negative time");
           m_id = Simulator::Schedule (requiredDelayTime, &QueueDisc::Run, this);
-          NS_LOG_LOGIC("Waking Event Scheduled in " << requiredDelayTime);
+          NS_LOG_LOGIC("Waking Event Scheduled in " << requiredDelayTime.As (Time::S));
         }
     }
   return 0;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/traffic-control/test/tbf-queue-disc-test-suite.cc ns-3.35/src/traffic-control/test/tbf-queue-disc-test-suite.cc
--- ns-3.34/src/traffic-control/test/tbf-queue-disc-test-suite.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/traffic-control/test/tbf-queue-disc-test-suite.cc	2021-10-01 13:26:48.000000000 -0700
@@ -334,10 +334,10 @@
   Simulator::Stop (Seconds (1.3));
   Simulator::Run ();
 
-  // test 4 : When DataRate < FirstBucketTokenRate; burst condition, peakRate is set so that bursts are controlled.
-  /* This test checks the burst control ability of TBF. 10 packets each of size 1000 bytes are enqueued followed by
+  // test 4 : This test checks the peakRate control of packet dequeue, when DataRate < FirstBucketTokenRate.
+  /* 10 packets each of size 1000 bytes are enqueued followed by
      their dequeue. The data rate (25 KB/s) is not sufficiently higher than the btokens rate (15 KB/s), so that in
-     the startup phase the first bucket is not empty. Hence when adequate tokens are present in the second bucket,
+     the startup phase the first bucket is not empty. Hence when adequate tokens are present in the second (peak) bucket,
      the packets get transmitted, otherwise they are blocked. So basically the transmission of packets falls under the
      regulation of the second bucket since first bucket will always have excess tokens. TBF does not let all
      the packets go smoothly without any control just because there are excess tokens in the first bucket. */
@@ -365,6 +365,7 @@
 
   burst = 15000;
   mtu = 1000;
+  pktSize = 1000;
   rate = DataRate ("15KB/s");
   peakRate = DataRate ("20KB/s");
 
@@ -392,17 +393,27 @@
       Simulator::Schedule (Time (Seconds ((i + 1) * delay)), &TbfQueueDiscTestCase::Enqueue, this, queue, dest, pktSize);
     }
 
+  // The pattern being checked is a pattern of dequeue followed by blocked.  The delay between enqueues is not sufficient
+  // to allow ptokens to refill befor the next dequeue.  The first enqueue is at 1.08s in the future, and the attempted
+  // dequeue is at 1.10s in the future.  The first dequeue will always succeed.  The second enqueue is 1.12s and attempted
+  // dequeue is at 1.14s in the future, but the last dequeue was 0.04s prior; only 800 tokens can be refilled in 0.04s
+  // at a peak rate of 20Kbps.  The actual dequeue occurs at 0.01s further into the future when ptokens refills to 1000.
+  // To repeat the pattern, odd-numbered dequeue events should be spaced at intervals of at least 100ms, and the
+  // even-numbered dequeue events (that block) should be 0.04s (delay) following the last odd-numbered dequeue event.
+  double nextDelay = (2 * delay) + 0.02; // 20ms after first enqueue to attempt the first dequeue;
   for (uint32_t i = 1; i <= nPkt; i++)
     {
       if (i % 2 == 1)
         {
-          Simulator::Schedule (Time (Seconds ((i + 1) * delay + 0.02)), &TbfQueueDiscTestCase::DequeueAndCheck, this,
+          Simulator::Schedule (Seconds (nextDelay), &TbfQueueDiscTestCase::DequeueAndCheck, this,
                                queue, true, "1st packet should not be blocked");
+          nextDelay += 0.04;
         }
       else
         {
-          Simulator::Schedule (Time (Seconds ((i + 1) * delay + 0.02)), &TbfQueueDiscTestCase::DequeueAndCheck, this,
+          Simulator::Schedule (Seconds (nextDelay), &TbfQueueDiscTestCase::DequeueAndCheck, this,
                                queue, false, "This packet should be blocked");
+          nextDelay += 0.06;  // Need 0.04 + 0.06 seconds to allow the next packet to be dequeued without block
         }
     }
   Simulator::Stop (Seconds (0.55));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/uan/bindings/modulegen__gcc_ILP32.py ns-3.35/src/uan/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/uan/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/uan/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1782,11 +1782,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1891,11 +1886,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2012,11 +2002,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2209,11 +2194,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3905,6 +3885,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -3932,6 +3917,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -7808,6 +7798,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -7842,6 +7837,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/uan/bindings/modulegen__gcc_LP64.py ns-3.35/src/uan/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/uan/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/uan/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1782,11 +1782,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1891,11 +1886,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2012,11 +2002,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2209,11 +2194,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -3905,6 +3885,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -3932,6 +3917,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -7808,6 +7798,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -7842,6 +7837,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -1117,11 +1117,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1226,11 +1221,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1347,11 +1337,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1544,11 +1529,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_LP64.py ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/virtual-net-device/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -1117,11 +1117,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1226,11 +1221,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1347,11 +1337,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1544,11 +1529,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/visualizer/bindings/modulegen__gcc_ILP32.py ns-3.35/src/visualizer/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/visualizer/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/visualizer/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -424,18 +424,18 @@
     ## 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')
@@ -1491,11 +1491,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1568,6 +1563,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1588,11 +1588,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1661,11 +1670,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1782,11 +1786,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1979,11 +1978,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/visualizer/bindings/modulegen__gcc_LP64.py ns-3.35/src/visualizer/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/visualizer/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/visualizer/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -424,18 +424,18 @@
     ## 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')
@@ -1491,11 +1491,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1568,6 +1563,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -1588,11 +1588,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -1661,11 +1670,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -1782,11 +1786,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -1979,11 +1978,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wave/bindings/modulegen__gcc_ILP32.py ns-3.35/src/wave/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/wave/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wave/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -21,7 +21,7 @@
     root_module = module.get_root()
     
     ## 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')
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', '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]
@@ -35,13 +35,13 @@
     ## 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')
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], 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-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_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_80211p', '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]
@@ -662,8 +662,6 @@
     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&')
@@ -683,9 +681,15 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )', 'ns3::WifiPhy::MonitorSnifferTxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferTxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferTxCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::WifiPhy::PhyTxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::WifiPhy::PhyTxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::WifiPhy::PhyTxBeginTracedCallback&')
     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::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )', 'ns3::WifiPhy::PhyRxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )*', 'ns3::WifiPhy::PhyRxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )&', 'ns3::WifiPhy::PhyRxBeginTracedCallback&')
     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&')
@@ -713,12 +717,12 @@
     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]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -755,6 +759,9 @@
     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('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::DroppedOldMpdu')
+    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::DroppedOldMpdu*')
+    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::DroppedOldMpdu&')
     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&')
@@ -1206,7 +1213,7 @@
     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::pair< unsigned int, unsigned int >, double >', ('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::EdcaParameters', ('ns3::AcIndex', 'ns3::EdcaParameter'), container_type='map')
     module.add_container('std::vector< double >', 'double', container_type='vector')
@@ -1224,9 +1231,8 @@
     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::vector< ns3::BandInfo >', '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')
@@ -1236,13 +1242,12 @@
     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::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='vector')
     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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     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::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')
@@ -1639,7 +1644,6 @@
     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'])
@@ -3571,18 +3575,18 @@
     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 const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [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 const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
                    [param('std::pair< unsigned int, unsigned int >', 'band')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand & rxPower) [member function]
     cls.add_method('AddForeignSignal', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', 'rxPower')])
     ## 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::PhyEntity::SnrPer', 
@@ -3635,10 +3639,10 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -3724,11 +3728,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -3801,6 +3800,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -3821,11 +3825,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -3946,11 +3959,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4067,11 +4075,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4407,11 +4410,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -6158,6 +6156,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -6185,6 +6188,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -6662,11 +6670,6 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('SetStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   deprecated=True, is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -7011,6 +7014,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -7141,6 +7146,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -8042,11 +8052,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -8087,11 +8102,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -8112,10 +8132,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -8140,10 +8165,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
@@ -9330,10 +9360,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -9554,15 +9584,12 @@
     cls.add_constructor([param('ns3::Txop const &', 'arg0')])
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
     ## 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'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
     cls.add_method('GetAccessStatus', 
                    'ns3::Txop::ChannelAccessStatus', 
@@ -9572,17 +9599,17 @@
     cls.add_method('GetAifsn', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
     cls.add_method('GetMinCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
     cls.add_method('GetTxopLimit', 
                    'ns3::Time', 
@@ -9676,10 +9703,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -9729,11 +9756,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
     cls.add_method('RequestAccess', 
                    'void', 
@@ -10042,11 +10064,6 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-80211p-helper.h (module 'wave'): void ns3::Wifi80211pHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('SetStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   deprecated=True, is_virtual=True)
     return
 
 def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
@@ -10813,9 +10830,14 @@
                    '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 &', 
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
+    cls.add_method('GetQueueAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
+    cls.add_method('GetQueueIterator', 
+                   'ns3::WifiMacQueueItem::ConstIterator', 
                    [], 
                    is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
@@ -10833,6 +10855,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
+    cls.add_method('IsInFlight', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
     cls.add_method('IsQueued', 
                    'bool', 
@@ -10843,6 +10870,14 @@
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
+    cls.add_method('ResetInFlight', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
+    cls.add_method('SetInFlight', 
+                   'void', 
+                   [])
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
                    'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
@@ -10853,17 +10888,6 @@
                    [])
     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([])
@@ -10916,10 +10940,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, ns3::Time rxDuration) [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'), param('ns3::Time', 'rxDuration')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -11200,10 +11224,10 @@
     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]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPowersW')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
@@ -11638,6 +11662,11 @@
     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 >', 
@@ -11663,6 +11692,11 @@
                    'uint16_t', 
                    [], 
                    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, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
@@ -11928,6 +11962,11 @@
                    '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::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   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', 
@@ -12275,6 +12314,10 @@
     cls.add_method('Reset', 
                    'void', 
                    [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -12797,10 +12840,6 @@
                    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', 
@@ -12811,10 +12850,10 @@
                    'bool', 
                    [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]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
     cls.add_method('CreateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('DestroyAgreement', 
                    'void', 
@@ -12831,10 +12870,6 @@
     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', 
-                   [])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyGotAck', 
                    'void', 
@@ -12843,18 +12878,14 @@
     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, 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]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [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')])
+                   'std::pair< unsigned short, unsigned short >', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), 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::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::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', 
@@ -12880,10 +12911,6 @@
     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', 
@@ -12936,6 +12963,10 @@
     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::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
+    cls.add_method('SetDroppedOldMpduCallback', 
+                   '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', 
@@ -12949,6 +12980,11 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3BooleanChecker_methods(root_module, cls):
@@ -13060,12 +13096,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   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=['void'], visibility='protected')
+                   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::ObjectBase*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -13175,11 +13216,6 @@
     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', 
@@ -13357,6 +13393,10 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DisableEdcaFor(ns3::Ptr<ns3::Txop> qosTxop, ns3::Time duration) [member function]
+    cls.add_method('DisableEdcaFor', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'qosTxop'), param('ns3::Time', 'duration')])
     ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
     cls.add_method('GetAccessGrantStart', 
                    'ns3::Time', 
@@ -14800,8 +14840,6 @@
     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', 
@@ -14827,9 +14865,9 @@
                    '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]
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand const & ns3::Event::GetRxPowerWPerBand() const [member function]
     cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   'ns3::RxPowerWattPerChannelBand const &', 
                    [], 
                    is_const=True)
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
@@ -14842,10 +14880,10 @@
                    'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand const & rxPower) [member function]
     cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -14950,6 +14988,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyInternalCollision(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')], 
+                   is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
     cls.add_method('NotifyOffNow', 
                    'void', 
@@ -15039,10 +15082,10 @@
                    '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]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('DequeueMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -17023,6 +17066,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -17057,6 +17105,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -17733,11 +17786,6 @@
                    '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', 
@@ -17825,11 +17873,6 @@
                    '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', 
@@ -17867,10 +17910,10 @@
     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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -17901,10 +17944,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -17926,10 +17969,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -18056,10 +18099,10 @@
                    '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]
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')], 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')], 
                    visibility='protected')
     return
 
@@ -18172,6 +18215,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::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')
     ## 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', 
@@ -18240,33 +18288,18 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
-    cls.add_constructor([])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
     cls.add_method('IsQosTxop', 
                    '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', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    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::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
     cls.add_method('NotifyChannelAccessed', 
                    'void', 
@@ -18286,6 +18319,11 @@
     cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
                    [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
     cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
@@ -18345,10 +18383,6 @@
     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', 
-                   [param('ns3::AcIndex', 'ac')])
     ## 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', 
@@ -18405,23 +18439,24 @@
     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]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator 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]
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', '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::ConstIterator & 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')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', '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::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('SetQosQueueSize', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
     cls.add_method('IsTxopStarted', 
                    'bool', 
@@ -18432,6 +18467,51 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint16_t', 'cwMin')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint16_t', 'cwMax')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('ns3::Time', 'timer')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
+    cls.add_method('StartMuEdcaTimerNow', 
+                   'void', 
+                   [])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
+    cls.add_method('MuEdcaTimerRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
+    cls.add_method('EdcaDisabled', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
+                   [], 
+                   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]
@@ -19035,6 +19115,41 @@
                    'ns3::Ptr< ns3::QosTxop >', 
                    [param('uint8_t', 'tid')], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -19055,6 +19170,16 @@
                    'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -19115,51 +19240,21 @@
                    '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')
     ## 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', 
-                   [], 
-                   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('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, 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, 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_Ns3Ssid_methods(root_module, cls):
@@ -19628,8 +19723,8 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
-    cls.add_constructor([])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
     cls.add_method('SetMaxDelay', 
                    'void', 
@@ -19657,26 +19752,10 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    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'): void ns3::WifiMacQueue::DequeueIfQueued(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueIfQueued', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
     ## 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 >', 
@@ -19745,6 +19824,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    cls.add_method('TtlExceeded', 
+                   'bool', 
+                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
     ## 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]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wave/bindings/modulegen__gcc_LP64.py ns-3.35/src/wave/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/wave/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wave/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -21,7 +21,7 @@
     root_module = module.get_root()
     
     ## 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')
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', '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]
@@ -35,13 +35,13 @@
     ## 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')
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'], 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-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_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_80211p', '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]
@@ -662,8 +662,6 @@
     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&')
@@ -683,9 +681,15 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )', 'ns3::WifiPhy::MonitorSnifferTxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferTxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferTxCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::WifiPhy::PhyTxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::WifiPhy::PhyTxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::WifiPhy::PhyTxBeginTracedCallback&')
     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::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )', 'ns3::WifiPhy::PhyRxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )*', 'ns3::WifiPhy::PhyRxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )&', 'ns3::WifiPhy::PhyRxBeginTracedCallback&')
     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&')
@@ -713,12 +717,12 @@
     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]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'], import_from_module='ns.wifi')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -755,6 +759,9 @@
     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('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::DroppedOldMpdu')
+    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::DroppedOldMpdu*')
+    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::DroppedOldMpdu&')
     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&')
@@ -1206,7 +1213,7 @@
     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::pair< unsigned int, unsigned int >, double >', ('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::EdcaParameters', ('ns3::AcIndex', 'ns3::EdcaParameter'), container_type='map')
     module.add_container('std::vector< double >', 'double', container_type='vector')
@@ -1224,9 +1231,8 @@
     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::vector< ns3::BandInfo >', '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')
@@ -1236,13 +1242,12 @@
     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::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='vector')
     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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     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::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')
@@ -1639,7 +1644,6 @@
     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'])
@@ -3571,18 +3575,18 @@
     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 const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [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 const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
                    [param('std::pair< unsigned int, unsigned int >', 'band')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand & rxPower) [member function]
     cls.add_method('AddForeignSignal', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', 'rxPower')])
     ## 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::PhyEntity::SnrPer', 
@@ -3635,10 +3639,10 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -3724,11 +3728,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -3801,6 +3800,11 @@
     cls.add_constructor([param('ns3::Ipv4Address', 'local'), param('ns3::Ipv4Mask', 'mask')])
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4InterfaceAddress::Ipv4InterfaceAddress(ns3::Ipv4InterfaceAddress const & o) [constructor]
     cls.add_constructor([param('ns3::Ipv4InterfaceAddress const &', 'o')])
+    ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetAddress() const [member function]
+    cls.add_method('GetAddress', 
+                   'ns3::Ipv4Address', 
+                   [], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): ns3::Ipv4Address ns3::Ipv4InterfaceAddress::GetBroadcast() const [member function]
     cls.add_method('GetBroadcast', 
                    'ns3::Ipv4Address', 
@@ -3821,11 +3825,20 @@
                    'ns3::Ipv4InterfaceAddress::InterfaceAddressScope_e', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsInSameSubnet(ns3::Ipv4Address const b) const [member function]
+    cls.add_method('IsInSameSubnet', 
+                   'bool', 
+                   [param('ns3::Ipv4Address const', 'b')], 
+                   is_const=True)
     ## ipv4-interface-address.h (module 'internet'): bool ns3::Ipv4InterfaceAddress::IsSecondary() const [member function]
     cls.add_method('IsSecondary', 
                    'bool', 
                    [], 
                    is_const=True)
+    ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetAddress(ns3::Ipv4Address address) [member function]
+    cls.add_method('SetAddress', 
+                   'void', 
+                   [param('ns3::Ipv4Address', 'address')])
     ## ipv4-interface-address.h (module 'internet'): void ns3::Ipv4InterfaceAddress::SetBroadcast(ns3::Ipv4Address broadcast) [member function]
     cls.add_method('SetBroadcast', 
                    'void', 
@@ -3946,11 +3959,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4067,11 +4075,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4407,11 +4410,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -6158,6 +6156,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -6185,6 +6188,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -6662,11 +6670,6 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('SetStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   deprecated=True, is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -7011,6 +7014,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -7141,6 +7146,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -8042,11 +8052,16 @@
                    'std::string', 
                    [param('ns3::Ipv6Header::EcnType', 'ecn')], 
                    is_const=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetDestination() const [member function]
+    cls.add_method('GetDestination', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   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)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Header::DscpType ns3::Ipv6Header::GetDscp() const [member function]
     cls.add_method('GetDscp', 
                    'ns3::Ipv6Header::DscpType', 
@@ -8087,11 +8102,16 @@
                    'uint32_t', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSource() const [member function]
+    cls.add_method('GetSource', 
+                   'ns3::Ipv6Address', 
+                   [], 
+                   is_const=True)
     ## ipv6-header.h (module 'internet'): ns3::Ipv6Address ns3::Ipv6Header::GetSourceAddress() const [member function]
     cls.add_method('GetSourceAddress', 
                    'ns3::Ipv6Address', 
                    [], 
-                   is_const=True)
+                   deprecated=True, is_const=True)
     ## ipv6-header.h (module 'internet'): uint8_t ns3::Ipv6Header::GetTrafficClass() const [member function]
     cls.add_method('GetTrafficClass', 
                    'uint8_t', 
@@ -8112,10 +8132,15 @@
                    'void', 
                    [param('ns3::Buffer::Iterator', 'start')], 
                    is_const=True, is_virtual=True)
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestination(ns3::Ipv6Address dst) [member function]
+    cls.add_method('SetDestination', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'dst')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDestinationAddress(ns3::Ipv6Address dst) [member function]
     cls.add_method('SetDestinationAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'dst')])
+                   [param('ns3::Ipv6Address', 'dst')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetDscp(ns3::Ipv6Header::DscpType dscp) [member function]
     cls.add_method('SetDscp', 
                    'void', 
@@ -8140,10 +8165,15 @@
     cls.add_method('SetPayloadLength', 
                    'void', 
                    [param('uint16_t', 'len')])
+    ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSource(ns3::Ipv6Address src) [member function]
+    cls.add_method('SetSource', 
+                   'void', 
+                   [param('ns3::Ipv6Address', 'src')])
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetSourceAddress(ns3::Ipv6Address src) [member function]
     cls.add_method('SetSourceAddress', 
                    'void', 
-                   [param('ns3::Ipv6Address', 'src')])
+                   [param('ns3::Ipv6Address', 'src')], 
+                   deprecated=True)
     ## ipv6-header.h (module 'internet'): void ns3::Ipv6Header::SetTrafficClass(uint8_t traffic) [member function]
     cls.add_method('SetTrafficClass', 
                    'void', 
@@ -9330,10 +9360,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -9554,15 +9584,12 @@
     cls.add_constructor([param('ns3::Txop const &', 'arg0')])
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
     ## 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'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
     cls.add_method('GetAccessStatus', 
                    'ns3::Txop::ChannelAccessStatus', 
@@ -9572,17 +9599,17 @@
     cls.add_method('GetAifsn', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
     cls.add_method('GetMinCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
     cls.add_method('GetTxopLimit', 
                    'ns3::Time', 
@@ -9676,10 +9703,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -9729,11 +9756,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
     cls.add_method('RequestAccess', 
                    'void', 
@@ -10042,11 +10064,6 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-80211p-helper.h (module 'wave'): void ns3::Wifi80211pHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('SetStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   deprecated=True, is_virtual=True)
     return
 
 def register_Ns3WifiAckAfterTbPpdu_methods(root_module, cls):
@@ -10813,9 +10830,14 @@
                    '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 &', 
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
+    cls.add_method('GetQueueAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
+    cls.add_method('GetQueueIterator', 
+                   'ns3::WifiMacQueueItem::ConstIterator', 
                    [], 
                    is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
@@ -10833,6 +10855,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
+    cls.add_method('IsInFlight', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
     cls.add_method('IsQueued', 
                    'bool', 
@@ -10843,6 +10870,14 @@
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
+    cls.add_method('ResetInFlight', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
+    cls.add_method('SetInFlight', 
+                   'void', 
+                   [])
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
                    'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
@@ -10853,17 +10888,6 @@
                    [])
     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([])
@@ -10916,10 +10940,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, ns3::Time rxDuration) [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'), param('ns3::Time', 'rxDuration')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -11200,10 +11224,10 @@
     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]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPowersW')])
     ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxEnd(ns3::Ptr<const ns3::WifiPsdu> psdu) [member function]
     cls.add_method('NotifyRxEnd', 
                    'void', 
@@ -11638,6 +11662,11 @@
     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 >', 
@@ -11663,6 +11692,11 @@
                    'uint16_t', 
                    [], 
                    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, is_virtual=True)
     ## wifi-ppdu.h (module 'wifi'): ns3::Time ns3::WifiPpdu::GetTxDuration() const [member function]
     cls.add_method('GetTxDuration', 
                    'ns3::Time', 
@@ -11928,6 +11962,11 @@
                    '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::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   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', 
@@ -12275,6 +12314,10 @@
     cls.add_method('Reset', 
                    'void', 
                    [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -12797,10 +12840,6 @@
                    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', 
@@ -12811,10 +12850,10 @@
                    'bool', 
                    [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]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
     cls.add_method('CreateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('DestroyAgreement', 
                    'void', 
@@ -12831,10 +12870,6 @@
     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', 
-                   [])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyGotAck', 
                    'void', 
@@ -12843,18 +12878,14 @@
     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, 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]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [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')])
+                   'std::pair< unsigned short, unsigned short >', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), 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::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::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', 
@@ -12880,10 +12911,6 @@
     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', 
@@ -12936,6 +12963,10 @@
     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::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
+    cls.add_method('SetDroppedOldMpduCallback', 
+                   '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', 
@@ -12949,6 +12980,11 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3BooleanChecker_methods(root_module, cls):
@@ -13060,12 +13096,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   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=['void'], visibility='protected')
+                   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::ObjectBase*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -13175,11 +13216,6 @@
     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', 
@@ -13357,6 +13393,10 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DisableEdcaFor(ns3::Ptr<ns3::Txop> qosTxop, ns3::Time duration) [member function]
+    cls.add_method('DisableEdcaFor', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'qosTxop'), param('ns3::Time', 'duration')])
     ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
     cls.add_method('GetAccessGrantStart', 
                    'ns3::Time', 
@@ -14800,8 +14840,6 @@
     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', 
@@ -14827,9 +14865,9 @@
                    '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]
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand const & ns3::Event::GetRxPowerWPerBand() const [member function]
     cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   'ns3::RxPowerWattPerChannelBand const &', 
                    [], 
                    is_const=True)
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
@@ -14842,10 +14880,10 @@
                    'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand const & rxPower) [member function]
     cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -14950,6 +14988,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyInternalCollision(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')], 
+                   is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
     cls.add_method('NotifyOffNow', 
                    'void', 
@@ -15039,10 +15082,10 @@
                    '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]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('DequeueMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -17023,6 +17066,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -17057,6 +17105,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -17733,11 +17786,6 @@
                    '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', 
@@ -17825,11 +17873,6 @@
                    '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', 
@@ -17867,10 +17910,10 @@
     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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -17901,10 +17944,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -17926,10 +17969,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -18056,10 +18099,10 @@
                    '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]
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')], 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')], 
                    visibility='protected')
     return
 
@@ -18172,6 +18215,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::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')
     ## 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', 
@@ -18240,33 +18288,18 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop() [constructor]
-    cls.add_constructor([])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsQosTxop() const [member function]
     cls.add_method('IsQosTxop', 
                    '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', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
-                   is_virtual=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::HasFramesToTransmit() [member function]
     cls.add_method('HasFramesToTransmit', 
                    'bool', 
                    [], 
                    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::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
     cls.add_method('NotifyChannelAccessed', 
                    'void', 
@@ -18286,6 +18319,11 @@
     cls.add_method('SetQosFrameExchangeManager', 
                    'void', 
                    [param('ns3::Ptr< ns3::QosFrameExchangeManager > const', 'qosFem')])
+    ## qos-txop.h (module 'wifi'): ns3::AcIndex ns3::QosTxop::GetAccessCategory() const [member function]
+    cls.add_method('GetAccessCategory', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::UseExplicitBarAfterMissedBlockAck() const [member function]
     cls.add_method('UseExplicitBarAfterMissedBlockAck', 
                    'bool', 
@@ -18345,10 +18383,6 @@
     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', 
-                   [param('ns3::AcIndex', 'ac')])
     ## 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', 
@@ -18405,23 +18439,24 @@
     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]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator 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]
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', '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::ConstIterator & 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')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', '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::SetQosQueueSize(ns3::Ptr<ns3::WifiMacQueueItem> mpdu) [member function]
-    cls.add_method('SetQosQueueSize', 
-                   'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::IsTxopStarted() const [member function]
     cls.add_method('IsTxopStarted', 
                    'bool', 
@@ -18432,6 +18467,51 @@
                    'ns3::Time', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint16_t', 'cwMin')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint16_t', 'cwMax')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('ns3::Time', 'timer')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
+    cls.add_method('StartMuEdcaTimerNow', 
+                   'void', 
+                   [])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
+    cls.add_method('MuEdcaTimerRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
+    cls.add_method('EdcaDisabled', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
+                   [], 
+                   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]
@@ -19035,6 +19115,41 @@
                    'ns3::Ptr< ns3::QosTxop >', 
                    [param('uint8_t', 'tid')], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -19055,6 +19170,16 @@
                    'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -19115,51 +19240,21 @@
                    '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')
     ## 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', 
-                   [], 
-                   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('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, 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, 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_Ns3Ssid_methods(root_module, cls):
@@ -19628,8 +19723,8 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
-    cls.add_constructor([])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
     cls.add_method('SetMaxDelay', 
                    'void', 
@@ -19657,26 +19752,10 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    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'): void ns3::WifiMacQueue::DequeueIfQueued(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueIfQueued', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
     ## 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 >', 
@@ -19745,6 +19824,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    cls.add_method('TtlExceeded', 
+                   'bool', 
+                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
     ## 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]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wave/helper/wifi-80211p-helper.cc ns-3.35/src/wave/helper/wifi-80211p-helper.cc
--- ns-3.34/src/wave/helper/wifi-80211p-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wave/helper/wifi-80211p-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -63,20 +63,6 @@
     }
 }
 
-// NS_DEPRECATED_3_32
-void
-Wifi80211pHelper::SetStandard (enum WifiPhyStandard standard)
-{
-  if ((standard == WIFI_PHY_STANDARD_80211a) || (standard == WIFI_PHY_STANDARD_80211_10MHZ))
-    {
-      WifiHelper::SetStandard (WIFI_STANDARD_80211p);
-    }
-  else
-    {
-      NS_FATAL_ERROR ("802.11p only use 802.11 standard with 10MHz or 20MHz");
-    }
-}
-
 void
 Wifi80211pHelper::EnableLogComponents (void)
 {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wave/helper/wifi-80211p-helper.h ns-3.35/src/wave/helper/wifi-80211p-helper.h
--- ns-3.34/src/wave/helper/wifi-80211p-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wave/helper/wifi-80211p-helper.h	2021-10-01 13:26:48.000000000 -0700
@@ -61,16 +61,6 @@
   virtual void SetStandard (enum WifiStandard standard);
 
   /**
-   * \param standard the phy standard to configure during installation
-   *
-   * Users can only configure 802.11p with 10MHz or 5 MHz channel bandwidth.
-   * The default 802.11p standard uses 10MHz.
-   * \deprecated This method will go away in a future release of ns-3.
-   */
-  NS_DEPRECATED_3_32
-  virtual void SetStandard (WifiPhyStandard standard);
-
-  /**
    * \param phy the PHY helper to create PHY objects
    * \param macHelper the MAC helper to create MAC objects
    * \param c the set of nodes on which a wifi device must be created
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wave/model/ocb-wifi-mac.cc ns-3.35/src/wave/model/ocb-wifi-mac.cc
--- ns-3.34/src/wave/model/ocb-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wave/model/ocb-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
@@ -365,6 +365,9 @@
       dcf->SetMaxCw (cwmax);
       dcf->SetAifsn (aifsn);
       break;
+    case AC_BEACON:
+      // done by ApWifiMac
+      break;
     case AC_UNDEF:
       NS_FATAL_ERROR ("I don't know what to do with this");
       break;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wave/model/wave-frame-exchange-manager.cc ns-3.35/src/wave/model/wave-frame-exchange-manager.cc
--- ns-3.34/src/wave/model/wave-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wave/model/wave-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -133,7 +133,7 @@
     }
 
   m_dcf->NotifyChannelAccessed ();
-  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIteratorPairs ().front ().it;
+  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIterator ();
   NS_ASSERT (mpdu != 0);
 
   // assign a sequence number if this is not a fragment nor a retransmission
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/bindings/modulegen__gcc_ILP32.py ns-3.35/src/wifi/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/wifi/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -35,19 +35,19 @@
     ## 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'])
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', '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'])
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'])
     ## 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'])
     ## 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_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_80211p', '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]
@@ -701,8 +701,6 @@
     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&')
@@ -724,9 +722,15 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )', 'ns3::WifiPhy::MonitorSnifferTxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferTxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferTxCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::WifiPhy::PhyTxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::WifiPhy::PhyTxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::WifiPhy::PhyTxBeginTracedCallback&')
     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::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )', 'ns3::WifiPhy::PhyRxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )*', 'ns3::WifiPhy::PhyRxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )&', 'ns3::WifiPhy::PhyRxBeginTracedCallback&')
     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&')
@@ -754,12 +758,12 @@
     module.add_class('WifiRemoteStationManager', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'])
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -812,6 +816,9 @@
     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('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::DroppedOldMpdu')
+    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::DroppedOldMpdu*')
+    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::DroppedOldMpdu&')
     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&')
@@ -1024,6 +1031,8 @@
     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&')
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet [class]
+    module.add_class('MuEdcaParameterSet', parent=root_module['ns3::WifiInformationElement'])
     ## 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]
@@ -1424,7 +1433,7 @@
     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::pair< unsigned int, unsigned int >, double >', ('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')
@@ -1440,9 +1449,8 @@
     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('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::vector< ns3::BandInfo >', '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')
@@ -1452,8 +1460,8 @@
     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::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='vector')
     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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     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')
@@ -1462,7 +1470,6 @@
     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')
@@ -1902,7 +1909,6 @@
     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'])
@@ -2016,6 +2022,7 @@
     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_Ns3MuEdcaParameterSet_methods(root_module, root_module['ns3::MuEdcaParameterSet'])
     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'])
@@ -3979,18 +3986,18 @@
     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 const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [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 const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
                    [param('std::pair< unsigned int, unsigned int >', 'band')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand & rxPower) [member function]
     cls.add_method('AddForeignSignal', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', 'rxPower')])
     ## 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::PhyEntity::SnrPer', 
@@ -4043,10 +4050,10 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -4132,11 +4139,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4241,11 +4243,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4362,11 +4359,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4559,11 +4551,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -6384,6 +6371,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -6411,6 +6403,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -6754,11 +6751,6 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('SetStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   deprecated=True, is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -7254,6 +7246,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -7410,6 +7404,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -8397,6 +8396,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtAssocResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8471,6 +8475,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
     cls.add_method('SetStatusCode', 
                    'void', 
@@ -8704,6 +8712,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtProbeResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8788,6 +8801,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSsid(ns3::Ssid ssid) [member function]
     cls.add_method('SetSsid', 
                    'void', 
@@ -9739,10 +9756,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -10385,15 +10402,12 @@
     cls.add_constructor([param('ns3::Txop const &', 'arg0')])
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
     ## 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'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
     cls.add_method('GetAccessStatus', 
                    'ns3::Txop::ChannelAccessStatus', 
@@ -10403,17 +10417,17 @@
     cls.add_method('GetAifsn', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
     cls.add_method('GetMinCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
     cls.add_method('GetTxopLimit', 
                    'ns3::Time', 
@@ -10507,10 +10521,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -10560,11 +10574,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
     cls.add_method('RequestAccess', 
                    'void', 
@@ -11625,9 +11634,14 @@
                    '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 &', 
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
+    cls.add_method('GetQueueAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
+    cls.add_method('GetQueueIterator', 
+                   'ns3::WifiMacQueueItem::ConstIterator', 
                    [], 
                    is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
@@ -11645,6 +11659,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
+    cls.add_method('IsInFlight', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
     cls.add_method('IsQueued', 
                    'bool', 
@@ -11655,6 +11674,14 @@
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
+    cls.add_method('ResetInFlight', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
+    cls.add_method('SetInFlight', 
+                   'void', 
+                   [])
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
                    'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
@@ -11665,17 +11692,6 @@
                    [])
     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')])
@@ -12109,10 +12125,10 @@
     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]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -12292,10 +12308,10 @@
     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]
+    ## 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')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -12787,6 +12803,11 @@
                    '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::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   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', 
@@ -13134,6 +13155,10 @@
     cls.add_method('Reset', 
                    'void', 
                    [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -14194,10 +14219,6 @@
                    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', 
@@ -14208,10 +14229,10 @@
                    'bool', 
                    [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]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
     cls.add_method('CreateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('DestroyAgreement', 
                    'void', 
@@ -14228,10 +14249,6 @@
     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', 
-                   [])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyGotAck', 
                    'void', 
@@ -14240,18 +14257,14 @@
     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, 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]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [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')])
+                   'std::pair< unsigned short, unsigned short >', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), 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::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::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', 
@@ -14277,10 +14290,6 @@
     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', 
@@ -14333,6 +14342,10 @@
     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::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
+    cls.add_method('SetDroppedOldMpduCallback', 
+                   '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', 
@@ -14346,6 +14359,11 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3BooleanChecker_methods(root_module, cls):
@@ -14420,12 +14438,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   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=['void'], visibility='protected')
+                   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::ObjectBase*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14490,11 +14513,6 @@
     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', 
@@ -14764,6 +14782,10 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DisableEdcaFor(ns3::Ptr<ns3::Txop> qosTxop, ns3::Time duration) [member function]
+    cls.add_method('DisableEdcaFor', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'qosTxop'), param('ns3::Time', 'duration')])
     ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
     cls.add_method('GetAccessGrantStart', 
                    'ns3::Time', 
@@ -16788,8 +16810,6 @@
     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', 
@@ -16815,9 +16835,9 @@
                    '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]
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand const & ns3::Event::GetRxPowerWPerBand() const [member function]
     cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   'ns3::RxPowerWattPerChannelBand const &', 
                    [], 
                    is_const=True)
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
@@ -16830,10 +16850,10 @@
                    'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand const & rxPower) [member function]
     cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -17145,6 +17165,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyInternalCollision(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')], 
+                   is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
     cls.add_method('NotifyOffNow', 
                    'void', 
@@ -17234,10 +17259,10 @@
                    '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]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('DequeueMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -19084,6 +19109,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -19118,6 +19148,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -19155,10 +19190,10 @@
                    '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<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair queueIt) const [member function]
+    ## 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::ConstIterator 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')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt')], 
                    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', 
@@ -19201,10 +19236,10 @@
                    '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::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) const [member function]
+    ## 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::ConstIterator & 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')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')], 
                    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', 
@@ -19227,6 +19262,98 @@
                    is_virtual=True, visibility='protected')
     return
 
+def register_Ns3MuEdcaParameterSet_methods(root_module, cls):
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet(ns3::MuEdcaParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MuEdcaParameterSet const &', 'arg0')])
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet() [constructor]
+    cls.add_constructor([])
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetMuAifsn(uint8_t aci) const [member function]
+    cls.add_method('GetMuAifsn', 
+                   'uint8_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMax(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMax', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMin(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMin', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Time ns3::MuEdcaParameterSet::GetMuEdcaTimer(uint8_t aci) const [member function]
+    cls.add_method('GetMuEdcaTimer', 
+                   'ns3::Time', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetQosInfo() const [member function]
+    cls.add_method('GetQosInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): bool ns3::MuEdcaParameterSet::IsPresent() const [member function]
+    cls.add_method('IsPresent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuAifsn(uint8_t aci, uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint8_t', 'aifsn')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMax(uint8_t aci, uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMax')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMin(uint8_t aci, uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMin')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuEdcaTimer(uint8_t aci, ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('ns3::Time', 'timer')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
+    cls.add_method('SetQosInfo', 
+                   'void', 
+                   [param('uint8_t', 'qosInfo')])
+    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')])
@@ -20381,10 +20508,10 @@
     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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -20415,10 +20542,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -20440,10 +20567,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -20570,10 +20697,10 @@
                    '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]
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')], 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')], 
                    visibility='protected')
     return
 
@@ -20661,6 +20788,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::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')
     ## 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', 
@@ -20726,8 +20858,8 @@
 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([])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('AddBaResponseTimeout', 
                    'void', 
@@ -20741,16 +20873,26 @@
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
+    cls.add_method('EdcaDisabled', 
+                   'bool', 
+                   [], 
+                   is_const=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)
+                   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)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
     cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
@@ -20795,14 +20937,29 @@
                    '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]
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=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::ConstIterator & 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')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', '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'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
     cls.add_method('GetRemainingTxop', 
                    'ns3::Time', 
@@ -20836,6 +20993,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
+    cls.add_method('MuEdcaTimerRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
     cls.add_method('NotifyChannelAccessed', 
                    'void', 
@@ -20846,19 +21008,14 @@
                    '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'): 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]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator 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()')])
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', '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', 
@@ -20880,10 +21037,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::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', 
@@ -20905,19 +21058,30 @@
     cls.add_method('SetFailedAddBaTimeout', 
                    'void', 
                    [param('ns3::Time', 'failedAddBaTimeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint16_t', 'cwMax')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint16_t', 'cwMin')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('ns3::Time', 'timer')])
     ## 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', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
+    cls.add_method('StartMuEdcaTimerNow', 
                    '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', 
@@ -21524,6 +21688,41 @@
                    'ns3::Ptr< ns3::QosTxop >', 
                    [param('uint8_t', 'tid')], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -21544,6 +21743,16 @@
                    'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -21604,51 +21813,21 @@
                    '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')
     ## 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', 
-                   [], 
-                   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('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, 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, 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_Ns3RrMultiUserScheduler_methods(root_module, cls):
@@ -23071,8 +23250,8 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
-    cls.add_constructor([])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
     cls.add_method('SetMaxDelay', 
                    'void', 
@@ -23100,26 +23279,10 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    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'): void ns3::WifiMacQueue::DequeueIfQueued(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueIfQueued', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
     ## 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 >', 
@@ -23188,6 +23351,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    cls.add_method('TtlExceeded', 
+                   'bool', 
+                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
     ## 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]
@@ -23761,6 +23928,11 @@
                    'std::map< unsigned short, ns3::Mac48Address > const &', 
                    [], 
                    is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::ApWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
     ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -23789,11 +23961,6 @@
                    '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::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'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
     cls.add_method('SupportsSendFrom', 
                    'bool', 
@@ -25392,11 +25559,6 @@
                    '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', 
@@ -27073,10 +27235,10 @@
     cls.add_method('SetEndOfHeSigACallback', 
                    'void', 
                    [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]
+    ## 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::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -27098,10 +27260,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -27291,11 +27453,11 @@
     module.add_function('AddWifiMacTrailer', 
                         'void', 
                         [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## wifi-utils.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, ns3::Ptr<ns3::WifiNetDevice> const device) [free function]
+    ## wifi-phy-common.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, ns3::Ptr<ns3::WifiNetDevice> const device) [free function]
     module.add_function('ConvertGuardIntervalToNanoSeconds', 
                         'uint16_t', 
                         [param('ns3::WifiMode', 'mode'), param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
-    ## wifi-utils.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, bool htShortGuardInterval, ns3::Time heGuardInterval) [free function]
+    ## wifi-phy-common.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, bool htShortGuardInterval, ns3::Time heGuardInterval) [free function]
     module.add_function('ConvertGuardIntervalToNanoSeconds', 
                         'uint16_t', 
                         [param('ns3::WifiMode', 'mode'), param('bool', 'htShortGuardInterval'), param('ns3::Time', 'heGuardInterval')])
@@ -27319,7 +27481,7 @@
     module.add_function('GetBlockAckSize', 
                         'uint32_t', 
                         [param('ns3::BlockAckType', 'type')])
-    ## wifi-utils.h (module 'wifi'): uint16_t ns3::GetChannelWidthForTransmission(ns3::WifiMode mode, uint16_t maxSupportedChannelWidth) [free function]
+    ## wifi-phy-common.h (module 'wifi'): uint16_t ns3::GetChannelWidthForTransmission(ns3::WifiMode mode, uint16_t maxSupportedChannelWidth) [free function]
     module.add_function('GetChannelWidthForTransmission', 
                         'uint16_t', 
                         [param('ns3::WifiMode', 'mode'), param('uint16_t', 'maxSupportedChannelWidth')])
@@ -27343,11 +27505,11 @@
     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]
+    ## wifi-phy-common.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) [free function]
+    ## wifi-phy-common.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')])
@@ -27363,24 +27525,24 @@
     module.add_function('GetTid', 
                         'uint8_t', 
                         [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const', 'hdr')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsAllowedControlAnswerModulationClass(ns3::WifiModulationClass modClassReq, ns3::WifiModulationClass modClassAnswer) [free function]
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsAllowedControlAnswerModulationClass(ns3::WifiModulationClass modClassReq, ns3::WifiModulationClass modClassAnswer) [free function]
     module.add_function('IsAllowedControlAnswerModulationClass', 
                         'bool', 
                         [param('ns3::WifiModulationClass', 'modClassReq'), param('ns3::WifiModulationClass', 'modClassAnswer')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsHe(ns3::WifiPreamble preamble) [free function]
-    module.add_function('IsHe', 
-                        'bool', 
-                        [param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsHt(ns3::WifiPreamble preamble) [free function]
-    module.add_function('IsHt', 
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsDlMu(ns3::WifiPreamble preamble) [free function]
+    module.add_function('IsDlMu', 
                         'bool', 
                         [param('ns3::WifiPreamble', 'preamble')])
     ## wifi-utils.h (module 'wifi'): bool ns3::IsInWindow(uint16_t seq, uint16_t winstart, uint16_t winsize) [free function]
     module.add_function('IsInWindow', 
                         'bool', 
                         [param('uint16_t', 'seq'), param('uint16_t', 'winstart'), param('uint16_t', 'winsize')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsVht(ns3::WifiPreamble preamble) [free function]
-    module.add_function('IsVht', 
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsMu(ns3::WifiPreamble preamble) [free function]
+    module.add_function('IsMu', 
+                        'bool', 
+                        [param('ns3::WifiPreamble', 'preamble')])
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsUlMu(ns3::WifiPreamble preamble) [free function]
+    module.add_function('IsUlMu', 
                         'bool', 
                         [param('ns3::WifiPreamble', 'preamble')])
     ## ssid.h (module 'wifi'): ns3::Ptr<const ns3::AttributeChecker> ns3::MakeSsidChecker() [free function]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/bindings/modulegen__gcc_LP64.py ns-3.35/src/wifi/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/wifi/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -35,19 +35,19 @@
     ## 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'])
+    module.add_enum('AcIndex', ['AC_BE', 'AC_BK', 'AC_VI', 'AC_VO', 'AC_BE_NQOS', 'AC_BEACON', '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'])
+    module.add_enum('WifiMacDropReason', ['WIFI_MAC_DROP_FAILED_ENQUEUE', 'WIFI_MAC_DROP_EXPIRED_LIFETIME', 'WIFI_MAC_DROP_REACHED_RETRY_LIMIT', 'WIFI_MAC_DROP_QOS_OLD_PACKET'])
     ## 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'])
     ## 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_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_80211p', '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]
@@ -701,8 +701,6 @@
     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&')
@@ -724,9 +722,15 @@
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )', 'ns3::WifiPhy::MonitorSnifferTxCallback')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )*', 'ns3::WifiPhy::MonitorSnifferTxCallback*')
     typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const > const, uint16_t, ns3::WifiTxVector, ns3::MpduInfo, uint16_t )&', 'ns3::WifiPhy::MonitorSnifferTxCallback&')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )', 'ns3::WifiPhy::PhyTxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )*', 'ns3::WifiPhy::PhyTxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, double )&', 'ns3::WifiPhy::PhyTxBeginTracedCallback&')
     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::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )', 'ns3::WifiPhy::PhyRxBeginTracedCallback')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )*', 'ns3::WifiPhy::PhyRxBeginTracedCallback*')
+    typehandlers.add_type_alias('void ( * ) ( ns3::Ptr< ns3::Packet const >, ns3::RxPowerWattPerChannelBand )&', 'ns3::WifiPhy::PhyRxBeginTracedCallback&')
     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&')
@@ -754,12 +758,12 @@
     module.add_class('WifiRemoteStationManager', parent=root_module['ns3::Object'])
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationManager::ProtectionMode [enumeration]
     module.add_enum('ProtectionMode', ['RTS_CTS', 'CTS_TO_SELF'], outer_class=root_module['ns3::WifiRemoteStationManager'])
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >', 'ns3::WifiRemoteStationManager::Stations')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >*', 'ns3::WifiRemoteStationManager::Stations*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStation * >&', 'ns3::WifiRemoteStationManager::Stations&')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >', 'ns3::WifiRemoteStationManager::StationStates')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >*', 'ns3::WifiRemoteStationManager::StationStates*')
-    typehandlers.add_type_alias('std::vector< ns3::WifiRemoteStationState * >&', 'ns3::WifiRemoteStationManager::StationStates&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', 'ns3::WifiRemoteStationManager::Stations')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >*', 'ns3::WifiRemoteStationManager::Stations*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >&', 'ns3::WifiRemoteStationManager::Stations&')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', 'ns3::WifiRemoteStationManager::StationStates')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >*', 'ns3::WifiRemoteStationManager::StationStates*')
+    typehandlers.add_type_alias('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >&', 'ns3::WifiRemoteStationManager::StationStates&')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )*', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback*')
     typehandlers.add_type_alias('void ( * ) ( double, double, ns3::Mac48Address )&', 'ns3::WifiRemoteStationManager::PowerChangeTracedCallback&')
@@ -812,6 +816,9 @@
     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('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::DroppedOldMpdu')
+    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::DroppedOldMpdu*')
+    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::DroppedOldMpdu&')
     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&')
@@ -1024,6 +1031,8 @@
     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&')
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet [class]
+    module.add_class('MuEdcaParameterSet', parent=root_module['ns3::WifiInformationElement'])
     ## 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]
@@ -1424,7 +1433,7 @@
     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::pair< unsigned int, unsigned int >, double >', ('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')
@@ -1440,9 +1449,8 @@
     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('ns3::Bands', 'ns3::BandInfo', container_type='vector')
+    module.add_container('std::vector< ns3::BandInfo >', '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')
@@ -1452,8 +1460,8 @@
     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::vector< ns3::Ptr< ns3::WifiMacQueueItem > >', 'ns3::Ptr< ns3::WifiMacQueueItem >', container_type='vector')
     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::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStation *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStation * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStation *'), container_type='map')
+    module.add_container('std::unordered_map< ns3::Mac48Address, ns3::WifiRemoteStationState *, ns3::WifiAddressHash, std::equal_to< ns3::Mac48Address >, std::allocator< std::pair< ns3::Mac48Address const, ns3::WifiRemoteStationState * > > >', ('ns3::Mac48Address', 'ns3::WifiRemoteStationState *'), container_type='map')
     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')
@@ -1462,7 +1470,6 @@
     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')
@@ -1902,7 +1909,6 @@
     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'])
@@ -2016,6 +2022,7 @@
     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_Ns3MuEdcaParameterSet_methods(root_module, root_module['ns3::MuEdcaParameterSet'])
     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'])
@@ -3979,18 +3986,18 @@
     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 const & txVector, ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing=false) [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 const &', 'txVector'), param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower'), param('bool', 'isStartOfdmaRxing', default_value='false')])
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
                    [param('std::pair< unsigned int, unsigned int >', 'band')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::AddForeignSignal(ns3::Time duration, ns3::RxPowerWattPerChannelBand & rxPower) [member function]
     cls.add_method('AddForeignSignal', 
                    'void', 
-                   [param('ns3::Time', 'duration'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', 'rxPower')])
     ## 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::PhyEntity::SnrPer', 
@@ -4043,10 +4050,10 @@
     cls.add_method('SetNumberOfReceiveAntennas', 
                    'void', 
                    [param('uint8_t', 'rx')])
-    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::InterferenceHelper::UpdateEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -4132,11 +4139,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4241,11 +4243,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -4362,11 +4359,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -4559,11 +4551,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
@@ -6384,6 +6371,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector2D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector2D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector2D::y [variable]
@@ -6411,6 +6403,11 @@
                    'double', 
                    [], 
                    is_const=True)
+    ## vector.h (module 'core'): double ns3::Vector3D::GetLengthSquared() const [member function]
+    cls.add_method('GetLengthSquared', 
+                   'double', 
+                   [], 
+                   is_const=True)
     ## vector.h (module 'core'): ns3::Vector3D::x [variable]
     cls.add_instance_attribute('x', 'double', is_const=False)
     ## vector.h (module 'core'): ns3::Vector3D::y [variable]
@@ -6754,11 +6751,6 @@
                    'void', 
                    [param('ns3::WifiStandard', 'standard')], 
                    is_virtual=True)
-    ## wifi-helper.h (module 'wifi'): void ns3::WifiHelper::SetStandard(ns3::WifiPhyStandard standard) [member function]
-    cls.add_method('SetStandard', 
-                   'void', 
-                   [param('ns3::WifiPhyStandard', 'standard')], 
-                   deprecated=True, is_virtual=True)
     return
 
 def register_Ns3WifiMacHelper_methods(root_module, cls):
@@ -7254,6 +7246,8 @@
     cls.add_instance_attribute('m_address', 'ns3::Mac48Address', is_const=False)
     ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aggregation [variable]
     cls.add_instance_attribute('m_aggregation', 'bool', is_const=False)
+    ## wifi-remote-station-manager.h (module 'wifi'): ns3::WifiRemoteStationState::m_aid [variable]
+    cls.add_instance_attribute('m_aid', 'uint16_t', 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]
@@ -7410,6 +7404,11 @@
                    'double', 
                    [param('double', 'dbm')], 
                    is_static=True)
+    ## wifi-spectrum-value-helper.h (module 'spectrum'): static double ns3::WifiSpectrumValueHelper::GetBandPowerW(ns3::Ptr<ns3::SpectrumValue> psd, ns3::WifiSpectrumBand const & band) [member function]
+    cls.add_method('GetBandPowerW', 
+                   'double', 
+                   [param('ns3::Ptr< ns3::SpectrumValue >', 'psd'), param('ns3::WifiSpectrumBand const &', 'band')], 
+                   is_static=True)
     ## wifi-spectrum-value-helper.h (module 'spectrum'): static ns3::Ptr<ns3::SpectrumModel> ns3::WifiSpectrumValueHelper::GetSpectrumModel(uint32_t centerFrequency, uint16_t channelWidth, uint32_t bandBandwidth, uint16_t guardBandwidth) [member function]
     cls.add_method('GetSpectrumModel', 
                    'ns3::Ptr< ns3::SpectrumModel >', 
@@ -8397,6 +8396,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtAssocResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtAssocResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8471,6 +8475,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtAssocResponseHeader::SetStatusCode(ns3::StatusCode code) [member function]
     cls.add_method('SetStatusCode', 
                    'void', 
@@ -8704,6 +8712,11 @@
                    'ns3::TypeId', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## mgt-headers.h (module 'wifi'): ns3::MuEdcaParameterSet ns3::MgtProbeResponseHeader::GetMuEdcaParameterSet() const [member function]
+    cls.add_method('GetMuEdcaParameterSet', 
+                   'ns3::MuEdcaParameterSet', 
+                   [], 
+                   is_const=True)
     ## mgt-headers.h (module 'wifi'): uint32_t ns3::MgtProbeResponseHeader::GetSerializedSize() const [member function]
     cls.add_method('GetSerializedSize', 
                    'uint32_t', 
@@ -8788,6 +8801,10 @@
     cls.add_method('SetHtOperation', 
                    'void', 
                    [param('ns3::HtOperation', 'htOperation')])
+    ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetMuEdcaParameterSet(ns3::MuEdcaParameterSet muEdcaParameterSet) [member function]
+    cls.add_method('SetMuEdcaParameterSet', 
+                   'void', 
+                   [param('ns3::MuEdcaParameterSet', 'muEdcaParameterSet')])
     ## mgt-headers.h (module 'wifi'): void ns3::MgtProbeResponseHeader::SetSsid(ns3::Ssid ssid) [member function]
     cls.add_method('SetSsid', 
                    'void', 
@@ -9739,10 +9756,10 @@
     cls.add_binary_comparison_operator('==')
     ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::SpectrumModel const & arg0) [constructor]
     cls.add_constructor([param('ns3::SpectrumModel const &', 'arg0')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > centerFreqs) [constructor]
-    cls.add_constructor([param('std::vector< double >', 'centerFreqs')])
-    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands bands) [constructor]
-    cls.add_constructor([param('ns3::Bands', 'bands')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(std::vector<double, std::allocator<double> > const & centerFreqs) [constructor]
+    cls.add_constructor([param('std::vector< double > const &', 'centerFreqs')])
+    ## spectrum-model.h (module 'spectrum'): ns3::SpectrumModel::SpectrumModel(ns3::Bands const & bands) [constructor]
+    cls.add_constructor([param('ns3::Bands const &', 'bands')])
     ## spectrum-model.h (module 'spectrum'): std::vector<ns3::BandInfo, std::allocator<ns3::BandInfo> >::const_iterator ns3::SpectrumModel::Begin() const [member function]
     cls.add_method('Begin', 
                    'std::vector< ns3::BandInfo > const_iterator', 
@@ -10385,15 +10402,12 @@
     cls.add_constructor([param('ns3::Txop const &', 'arg0')])
     ## txop.h (module 'wifi'): ns3::Txop::Txop() [constructor]
     cls.add_constructor([])
+    ## txop.h (module 'wifi'): ns3::Txop::Txop(ns3::Ptr<ns3::WifiMacQueue> queue) [constructor]
+    cls.add_constructor([param('ns3::Ptr< ns3::WifiMacQueue >', 'queue')])
     ## 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'): ns3::Txop::ChannelAccessStatus ns3::Txop::GetAccessStatus() const [member function]
     cls.add_method('GetAccessStatus', 
                    'ns3::Txop::ChannelAccessStatus', 
@@ -10403,17 +10417,17 @@
     cls.add_method('GetAifsn', 
                    'uint8_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMaxCw() const [member function]
     cls.add_method('GetMaxCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): uint32_t ns3::Txop::GetMinCw() const [member function]
     cls.add_method('GetMinCw', 
                    'uint32_t', 
                    [], 
-                   is_const=True)
+                   is_const=True, is_virtual=True)
     ## txop.h (module 'wifi'): ns3::Time ns3::Txop::GetTxopLimit() const [member function]
     cls.add_method('GetTxopLimit', 
                    'ns3::Time', 
@@ -10507,10 +10521,10 @@
     cls.add_method('SetTxopLimit', 
                    'void', 
                    [param('ns3::Time', 'txopLimit')])
-    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiRemoteStationManager(ns3::Ptr<ns3::WifiRemoteStationManager> const remoteManager) [member function]
-    cls.add_method('SetWifiRemoteStationManager', 
+    ## txop.h (module 'wifi'): void ns3::Txop::SetWifiMac(ns3::Ptr<ns3::RegularWifiMac> const mac) [member function]
+    cls.add_method('SetWifiMac', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiRemoteStationManager > const', 'remoteManager')], 
+                   [param('ns3::Ptr< ns3::RegularWifiMac > const', 'mac')], 
                    is_virtual=True)
     ## txop.h (module 'wifi'): void ns3::Txop::StartBackoffNow(uint32_t nSlots) [member function]
     cls.add_method('StartBackoffNow', 
@@ -10560,11 +10574,6 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
-    ## txop.h (module 'wifi'): void ns3::Txop::NotifyInternalCollision() [member function]
-    cls.add_method('NotifyInternalCollision', 
-                   'void', 
-                   [], 
-                   is_virtual=True, visibility='protected')
     ## txop.h (module 'wifi'): void ns3::Txop::RequestAccess() [member function]
     cls.add_method('RequestAccess', 
                    'void', 
@@ -11625,9 +11634,14 @@
                    '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 &', 
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::AcIndex ns3::WifiMacQueueItem::GetQueueAc() const [member function]
+    cls.add_method('GetQueueAc', 
+                   'ns3::AcIndex', 
+                   [], 
+                   is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::ConstIterator ns3::WifiMacQueueItem::GetQueueIterator() const [member function]
+    cls.add_method('GetQueueIterator', 
+                   'ns3::WifiMacQueueItem::ConstIterator', 
                    [], 
                    is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): uint32_t ns3::WifiMacQueueItem::GetSize() const [member function]
@@ -11645,6 +11659,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsInFlight() const [member function]
+    cls.add_method('IsInFlight', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## wifi-mac-queue-item.h (module 'wifi'): bool ns3::WifiMacQueueItem::IsQueued() const [member function]
     cls.add_method('IsQueued', 
                    'bool', 
@@ -11655,6 +11674,14 @@
                    'void', 
                    [param('std::ostream &', 'os')], 
                    is_const=True, is_virtual=True)
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::ResetInFlight() [member function]
+    cls.add_method('ResetInFlight', 
+                   'void', 
+                   [])
+    ## wifi-mac-queue-item.h (module 'wifi'): void ns3::WifiMacQueueItem::SetInFlight() [member function]
+    cls.add_method('SetInFlight', 
+                   'void', 
+                   [])
     ## wifi-mac-queue-item.h (module 'wifi'): ns3::WifiMacQueueItem::DeaggregatedMsdusCI ns3::WifiMacQueueItem::begin() [member function]
     cls.add_method('begin', 
                    'ns3::WifiMacQueueItem::DeaggregatedMsdusCI', 
@@ -11665,17 +11692,6 @@
                    [])
     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')])
@@ -12109,10 +12125,10 @@
     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]
+    ## wifi-phy.h (module 'wifi'): void ns3::WifiPhy::NotifyRxBegin(ns3::Ptr<const ns3::WifiPsdu> psdu, ns3::RxPowerWattPerChannelBand const & 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')])
+                   [param('ns3::Ptr< ns3::WifiPsdu const >', 'psdu'), param('ns3::RxPowerWattPerChannelBand const &', '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', 
@@ -12292,10 +12308,10 @@
     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]
+    ## 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')])
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -12787,6 +12803,11 @@
                    '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::GetAssociationId(ns3::Mac48Address remoteAddress) const [member function]
+    cls.add_method('GetAssociationId', 
+                   'uint16_t', 
+                   [param('ns3::Mac48Address', 'remoteAddress')], 
+                   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', 
@@ -13134,6 +13155,10 @@
     cls.add_method('Reset', 
                    'void', 
                    [])
+    ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetAssociationId(ns3::Mac48Address remoteAddress, uint16_t aid) [member function]
+    cls.add_method('SetAssociationId', 
+                   'void', 
+                   [param('ns3::Mac48Address', 'remoteAddress'), param('uint16_t', 'aid')])
     ## wifi-remote-station-manager.h (module 'wifi'): void ns3::WifiRemoteStationManager::SetDefaultTxPowerLevel(uint8_t txPower) [member function]
     cls.add_method('SetDefaultTxPowerLevel', 
                    'void', 
@@ -14194,10 +14219,6 @@
                    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', 
@@ -14208,10 +14229,10 @@
                    'bool', 
                    [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]
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::CreateAgreement(ns3::MgtAddBaRequestHeader const * reqHdr, ns3::Mac48Address recipient, bool htSupported=true) [member function]
     cls.add_method('CreateAgreement', 
                    'void', 
-                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient')])
+                   [param('ns3::MgtAddBaRequestHeader const *', 'reqHdr'), param('ns3::Mac48Address', 'recipient'), param('bool', 'htSupported', default_value='true')])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DestroyAgreement(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('DestroyAgreement', 
                    'void', 
@@ -14228,10 +14249,6 @@
     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', 
-                   [])
     ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::NotifyGotAck(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('NotifyGotAck', 
                    'void', 
@@ -14240,18 +14257,14 @@
     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, 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]
+    ## block-ack-manager.h (module 'wifi'): std::pair<unsigned short, unsigned short> ns3::BlockAckManager::NotifyGotBlockAck(ns3::CtrlBAckResponseHeader const & blockAck, ns3::Mac48Address recipient, std::set<unsigned char, std::less<unsigned char>, std::allocator<unsigned char> > const & tids, size_t index=0) [member function]
     cls.add_method('NotifyGotBlockAck', 
-                   'void', 
-                   [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')])
+                   'std::pair< unsigned short, unsigned short >', 
+                   [param('ns3::CtrlBAckResponseHeader const &', 'blockAck'), param('ns3::Mac48Address', 'recipient'), param('std::set< unsigned char > const &', 'tids'), 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::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::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', 
@@ -14277,10 +14290,6 @@
     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', 
@@ -14333,6 +14342,10 @@
     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::SetDroppedOldMpduCallback(ns3::BlockAckManager::DroppedOldMpdu callback) [member function]
+    cls.add_method('SetDroppedOldMpduCallback', 
+                   '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', 
@@ -14346,6 +14359,11 @@
     cls.add_method('ScheduleBar', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'bar'), param('bool', 'skipIfNoDataQueued', default_value='false')])
+    ## block-ack-manager.h (module 'wifi'): void ns3::BlockAckManager::DoDispose() [member function]
+    cls.add_method('DoDispose', 
+                   'void', 
+                   [], 
+                   is_virtual=True, visibility='protected')
     return
 
 def register_Ns3BooleanChecker_methods(root_module, cls):
@@ -14420,12 +14438,17 @@
     cls.add_method('GetCppTypeid', 
                    'std::string', 
                    [], 
-                   is_static=True, template_parameters=['ns3::ObjectBase*'], visibility='protected')
+                   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=['void'], visibility='protected')
+                   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::ObjectBase*'], visibility='protected')
     ## callback.h (module 'core'): static std::string ns3::CallbackImplBase::GetCppTypeid() [member function]
     cls.add_method('GetCppTypeid', 
                    'std::string', 
@@ -14490,11 +14513,6 @@
     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', 
@@ -14764,6 +14782,10 @@
     cls.add_method('Add', 
                    'void', 
                    [param('ns3::Ptr< ns3::Txop >', 'txop')])
+    ## channel-access-manager.h (module 'wifi'): void ns3::ChannelAccessManager::DisableEdcaFor(ns3::Ptr<ns3::Txop> qosTxop, ns3::Time duration) [member function]
+    cls.add_method('DisableEdcaFor', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'qosTxop'), param('ns3::Time', 'duration')])
     ## channel-access-manager.h (module 'wifi'): ns3::Time ns3::ChannelAccessManager::GetAccessGrantStart(bool ignoreNav=false) const [member function]
     cls.add_method('GetAccessGrantStart', 
                    'ns3::Time', 
@@ -16788,8 +16810,6 @@
     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', 
@@ -16815,9 +16835,9 @@
                    '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]
+    ## interference-helper.h (module 'wifi'): ns3::RxPowerWattPerChannelBand const & ns3::Event::GetRxPowerWPerBand() const [member function]
     cls.add_method('GetRxPowerWPerBand', 
-                   'ns3::RxPowerWattPerChannelBand', 
+                   'ns3::RxPowerWattPerChannelBand const &', 
                    [], 
                    is_const=True)
     ## interference-helper.h (module 'wifi'): ns3::Time ns3::Event::GetStartTime() const [member function]
@@ -16830,10 +16850,10 @@
                    'ns3::WifiTxVector const &', 
                    [], 
                    is_const=True)
-    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand rxPower) [member function]
+    ## interference-helper.h (module 'wifi'): void ns3::Event::UpdateRxPowerW(ns3::RxPowerWattPerChannelBand const & rxPower) [member function]
     cls.add_method('UpdateRxPowerW', 
                    'void', 
-                   [param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPower')])
+                   [param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')])
     return
 
 def register_Ns3EventImpl_methods(root_module, cls):
@@ -17145,6 +17165,11 @@
                    'bool', 
                    [], 
                    is_const=True)
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyInternalCollision(ns3::Ptr<ns3::Txop> txop) [member function]
+    cls.add_method('NotifyInternalCollision', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::Txop >', 'txop')], 
+                   is_virtual=True)
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::NotifyOffNow() [member function]
     cls.add_method('NotifyOffNow', 
                    'void', 
@@ -17234,10 +17259,10 @@
                    '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]
+    ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DequeueMpdu(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
     cls.add_method('DequeueMpdu', 
                    'void', 
-                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')], 
                    is_virtual=True, visibility='protected')
     ## frame-exchange-manager.h (module 'wifi'): void ns3::FrameExchangeManager::DoDispose() [member function]
     cls.add_method('DoDispose', 
@@ -19084,6 +19109,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True)
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::GetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('GetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   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', 
@@ -19118,6 +19148,11 @@
                    'ns3::Vector', 
                    [], 
                    is_const=True, is_pure_virtual=True, is_virtual=True, visibility='private')
+    ## mobility-model.h (module 'mobility'): ns3::Vector ns3::MobilityModel::DoGetPositionWithReference(ns3::Vector const & referencePosition) const [member function]
+    cls.add_method('DoGetPositionWithReference', 
+                   'ns3::Vector', 
+                   [param('ns3::Vector const &', 'referencePosition')], 
+                   is_const=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', 
@@ -19155,10 +19190,10 @@
                    '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<ns3::WifiMacQueueItem> mpdu, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair queueIt) const [member function]
+    ## 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::ConstIterator 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')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', 'queueIt')], 
                    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', 
@@ -19201,10 +19236,10 @@
                    '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::Ptr<const ns3::WifiMacQueueItem> peekedItem, ns3::WifiTxParameters & txParams, ns3::Time availableTime, ns3::WifiMacQueueItem::QueueIteratorPair & queueIt) const [member function]
+    ## 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::ConstIterator & 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')], 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('ns3::WifiMacQueueItem::ConstIterator &', 'queueIt')], 
                    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', 
@@ -19227,6 +19262,98 @@
                    is_virtual=True, visibility='protected')
     return
 
+def register_Ns3MuEdcaParameterSet_methods(root_module, cls):
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet(ns3::MuEdcaParameterSet const & arg0) [constructor]
+    cls.add_constructor([param('ns3::MuEdcaParameterSet const &', 'arg0')])
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::MuEdcaParameterSet::MuEdcaParameterSet() [constructor]
+    cls.add_constructor([])
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementId() const [member function]
+    cls.add_method('ElementId', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::WifiInformationElementId ns3::MuEdcaParameterSet::ElementIdExt() const [member function]
+    cls.add_method('ElementIdExt', 
+                   'ns3::WifiInformationElementId', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetInformationFieldSize() const [member function]
+    cls.add_method('GetInformationFieldSize', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetMuAifsn(uint8_t aci) const [member function]
+    cls.add_method('GetMuAifsn', 
+                   'uint8_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMax(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMax', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetMuCwMin(uint8_t aci) const [member function]
+    cls.add_method('GetMuCwMin', 
+                   'uint16_t', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Time ns3::MuEdcaParameterSet::GetMuEdcaTimer(uint8_t aci) const [member function]
+    cls.add_method('GetMuEdcaTimer', 
+                   'ns3::Time', 
+                   [param('uint8_t', 'aci')], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint8_t ns3::MuEdcaParameterSet::GetQosInfo() const [member function]
+    cls.add_method('GetQosInfo', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): uint16_t ns3::MuEdcaParameterSet::GetSerializedSize() const [member function]
+    cls.add_method('GetSerializedSize', 
+                   'uint16_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): bool ns3::MuEdcaParameterSet::IsPresent() const [member function]
+    cls.add_method('IsPresent', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): ns3::Buffer::Iterator ns3::MuEdcaParameterSet::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)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SerializeInformationField(ns3::Buffer::Iterator start) const [member function]
+    cls.add_method('SerializeInformationField', 
+                   'void', 
+                   [param('ns3::Buffer::Iterator', 'start')], 
+                   is_const=True, is_virtual=True)
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuAifsn(uint8_t aci, uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint8_t', 'aifsn')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMax(uint8_t aci, uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMax')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuCwMin(uint8_t aci, uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('uint16_t', 'cwMin')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetMuEdcaTimer(uint8_t aci, ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('uint8_t', 'aci'), param('ns3::Time', 'timer')])
+    ## mu-edca-parameter-set.h (module 'wifi'): void ns3::MuEdcaParameterSet::SetQosInfo(uint8_t qosInfo) [member function]
+    cls.add_method('SetQosInfo', 
+                   'void', 
+                   [param('uint8_t', 'qosInfo')])
+    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')])
@@ -20381,10 +20508,10 @@
     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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -20415,10 +20542,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::WifiTxVector const &', 'txVector'), param('ns3::Time', 'duration'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -20440,10 +20567,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -20570,10 +20697,10 @@
                    '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]
+    ## phy-entity.h (module 'wifi'): void ns3::PhyEntity::UpdateInterferenceEvent(ns3::Ptr<ns3::Event> event, ns3::RxPowerWattPerChannelBand const & 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')], 
+                   [param('ns3::Ptr< ns3::Event >', 'event'), param('ns3::RxPowerWattPerChannelBand const &', 'rxPower')], 
                    visibility='protected')
     return
 
@@ -20661,6 +20788,11 @@
                    'void', 
                    [], 
                    is_virtual=True, visibility='protected')
+    ## qos-frame-exchange-manager.h (module 'wifi'): void ns3::QosFrameExchangeManager::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')
     ## 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', 
@@ -20726,8 +20858,8 @@
 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([])
+    ## qos-txop.h (module 'wifi'): ns3::QosTxop::QosTxop(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::AddBaResponseTimeout(ns3::Mac48Address recipient, uint8_t tid) [member function]
     cls.add_method('AddBaResponseTimeout', 
                    'void', 
@@ -20741,16 +20873,26 @@
     cls.add_method('CompleteMpduTx', 
                    'void', 
                    [param('ns3::Ptr< ns3::WifiMacQueueItem >', 'mpdu')])
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::EdcaDisabled() const [member function]
+    cls.add_method('EdcaDisabled', 
+                   'bool', 
+                   [], 
+                   is_const=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)
+                   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)
+    ## qos-txop.h (module 'wifi'): uint8_t ns3::QosTxop::GetAifsn() const [member function]
+    cls.add_method('GetAifsn', 
+                   'uint8_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
     ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::GetBaAgreementEstablished(ns3::Mac48Address address, uint8_t tid) const [member function]
     cls.add_method('GetBaAgreementEstablished', 
                    'bool', 
@@ -20795,14 +20937,29 @@
                    '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]
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMaxCw() const [member function]
+    cls.add_method('GetMaxCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): uint32_t ns3::QosTxop::GetMinCw() const [member function]
+    cls.add_method('GetMinCw', 
+                   'uint32_t', 
+                   [], 
+                   is_const=True, is_virtual=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::ConstIterator & 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')])
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'peekedItem'), param('ns3::WifiTxParameters &', 'txParams'), param('ns3::Time', 'availableTime'), param('bool', 'initialFrame'), param('ns3::WifiMacQueueItem::ConstIterator &', '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'): uint8_t ns3::QosTxop::GetQosQueueSize(uint8_t tid, ns3::Mac48Address receiver) const [member function]
+    cls.add_method('GetQosQueueSize', 
+                   'uint8_t', 
+                   [param('uint8_t', 'tid'), param('ns3::Mac48Address', 'receiver')], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): ns3::Time ns3::QosTxop::GetRemainingTxop() const [member function]
     cls.add_method('GetRemainingTxop', 
                    'ns3::Time', 
@@ -20836,6 +20993,11 @@
                    'bool', 
                    [], 
                    is_const=True, is_virtual=True)
+    ## qos-txop.h (module 'wifi'): bool ns3::QosTxop::MuEdcaTimerRunning() const [member function]
+    cls.add_method('MuEdcaTimerRunning', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## qos-txop.h (module 'wifi'): void ns3::QosTxop::NotifyChannelAccessed(ns3::Time txopDuration) [member function]
     cls.add_method('NotifyChannelAccessed', 
                    'void', 
@@ -20846,19 +21008,14 @@
                    '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'): 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]
+    ## qos-txop.h (module 'wifi'): ns3::Ptr<const ns3::WifiMacQueueItem> ns3::QosTxop::PeekNextMpdu(ns3::WifiMacQueueItem::ConstIterator 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()')])
+                   [param('std::list< ns3::Ptr< ns3::WifiMacQueueItem > > const_iterator', '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', 
@@ -20880,10 +21037,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::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', 
@@ -20905,19 +21058,30 @@
     cls.add_method('SetFailedAddBaTimeout', 
                    'void', 
                    [param('ns3::Time', 'failedAddBaTimeout')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuAifsn(uint8_t aifsn) [member function]
+    cls.add_method('SetMuAifsn', 
+                   'void', 
+                   [param('uint8_t', 'aifsn')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMax(uint16_t cwMax) [member function]
+    cls.add_method('SetMuCwMax', 
+                   'void', 
+                   [param('uint16_t', 'cwMax')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuCwMin(uint16_t cwMin) [member function]
+    cls.add_method('SetMuCwMin', 
+                   'void', 
+                   [param('uint16_t', 'cwMin')])
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::SetMuEdcaTimer(ns3::Time timer) [member function]
+    cls.add_method('SetMuEdcaTimer', 
+                   'void', 
+                   [param('ns3::Time', 'timer')])
     ## 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', 
+    ## qos-txop.h (module 'wifi'): void ns3::QosTxop::StartMuEdcaTimerNow() [member function]
+    cls.add_method('StartMuEdcaTimerNow', 
                    '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', 
@@ -21524,6 +21688,41 @@
                    'ns3::Ptr< ns3::QosTxop >', 
                    [param('uint8_t', 'tid')], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::RegularWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetQosSupported() const [member function]
+    cls.add_method('GetQosSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetErpSupported() const [member function]
+    cls.add_method('GetErpSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetDsssSupported() const [member function]
+    cls.add_method('GetDsssSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHtSupported() const [member function]
+    cls.add_method('GetHtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetVhtSupported() const [member function]
+    cls.add_method('GetVhtSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): bool ns3::RegularWifiMac::GetHeSupported() const [member function]
+    cls.add_method('GetHeSupported', 
+                   'bool', 
+                   [], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): ns3::ExtendedCapabilities ns3::RegularWifiMac::GetExtendedCapabilities() const [member function]
     cls.add_method('GetExtendedCapabilities', 
                    'ns3::ExtendedCapabilities', 
@@ -21544,6 +21743,16 @@
                    'ns3::HeCapabilities', 
                    [], 
                    is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint32_t ns3::RegularWifiMac::GetMaxAmpduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmpduSize', 
+                   'uint32_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
+    ## regular-wifi-mac.h (module 'wifi'): uint16_t ns3::RegularWifiMac::GetMaxAmsduSize(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetMaxAmsduSize', 
+                   'uint16_t', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True)
     ## regular-wifi-mac.h (module 'wifi'): void ns3::RegularWifiMac::DoInitialize() [member function]
     cls.add_method('DoInitialize', 
                    'void', 
@@ -21604,51 +21813,21 @@
                    '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')
     ## 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', 
-                   [], 
-                   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('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, 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, 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_Ns3RrMultiUserScheduler_methods(root_module, cls):
@@ -23071,8 +23250,8 @@
                    'ns3::TypeId', 
                    [], 
                    is_static=True)
-    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue() [constructor]
-    cls.add_constructor([])
+    ## wifi-mac-queue.h (module 'wifi'): ns3::WifiMacQueue::WifiMacQueue(ns3::AcIndex ac=::ns3::AcIndex::AC_UNDEF) [constructor]
+    cls.add_constructor([param('ns3::AcIndex', 'ac', default_value='::ns3::AcIndex::AC_UNDEF')])
     ## wifi-mac-queue.h (module 'wifi'): void ns3::WifiMacQueue::SetMaxDelay(ns3::Time delay) [member function]
     cls.add_method('SetMaxDelay', 
                    'void', 
@@ -23100,26 +23279,10 @@
                    'ns3::Ptr< ns3::WifiMacQueueItem >', 
                    [], 
                    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'): void ns3::WifiMacQueue::DequeueIfQueued(ns3::Ptr<const ns3::WifiMacQueueItem> mpdu) [member function]
+    cls.add_method('DequeueIfQueued', 
+                   'void', 
+                   [param('ns3::Ptr< ns3::WifiMacQueueItem const >', 'mpdu')])
     ## 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 >', 
@@ -23188,6 +23351,10 @@
     cls.add_method('GetNBytes', 
                    'uint32_t', 
                    [])
+    ## wifi-mac-queue.h (module 'wifi'): bool ns3::WifiMacQueue::TtlExceeded(ns3::Queue<ns3::WifiMacQueueItem>::ConstIterator & it, ns3::Time const & now) [member function]
+    cls.add_method('TtlExceeded', 
+                   'bool', 
+                   [param('ns3::Queue< ns3::WifiMacQueueItem > ConstIterator &', 'it'), param('ns3::Time const &', 'now')])
     ## 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]
@@ -23761,6 +23928,11 @@
                    'std::map< unsigned short, ns3::Mac48Address > const &', 
                    [], 
                    is_const=True)
+    ## ap-wifi-mac.h (module 'wifi'): ns3::Ptr<ns3::WifiMacQueue> ns3::ApWifiMac::GetTxopQueue(ns3::AcIndex ac) const [member function]
+    cls.add_method('GetTxopQueue', 
+                   'ns3::Ptr< ns3::WifiMacQueue >', 
+                   [param('ns3::AcIndex', 'ac')], 
+                   is_const=True, is_virtual=True)
     ## ap-wifi-mac.h (module 'wifi'): static ns3::TypeId ns3::ApWifiMac::GetTypeId() [member function]
     cls.add_method('GetTypeId', 
                    'ns3::TypeId', 
@@ -23789,11 +23961,6 @@
                    '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::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'): bool ns3::ApWifiMac::SupportsSendFrom() const [member function]
     cls.add_method('SupportsSendFrom', 
                    'bool', 
@@ -25392,11 +25559,6 @@
                    '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', 
@@ -27073,10 +27235,10 @@
     cls.add_method('SetEndOfHeSigACallback', 
                    'void', 
                    [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]
+    ## 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::WifiPpdu >', 'ppdu'), param('std::map< std::pair< unsigned int, unsigned int >, double >', 'rxPowersW'), param('ns3::Time', 'rxDuration')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -27098,10 +27260,10 @@
                    '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]
+    ## 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')], 
+                   [param('ns3::Ptr< ns3::WifiPpdu const >', 'ppdu'), param('ns3::RxPowerWattPerChannelBand &', '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', 
@@ -27291,11 +27453,11 @@
     module.add_function('AddWifiMacTrailer', 
                         'void', 
                         [param('ns3::Ptr< ns3::Packet >', 'packet')])
-    ## wifi-utils.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, ns3::Ptr<ns3::WifiNetDevice> const device) [free function]
+    ## wifi-phy-common.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, ns3::Ptr<ns3::WifiNetDevice> const device) [free function]
     module.add_function('ConvertGuardIntervalToNanoSeconds', 
                         'uint16_t', 
                         [param('ns3::WifiMode', 'mode'), param('ns3::Ptr< ns3::WifiNetDevice > const', 'device')])
-    ## wifi-utils.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, bool htShortGuardInterval, ns3::Time heGuardInterval) [free function]
+    ## wifi-phy-common.h (module 'wifi'): uint16_t ns3::ConvertGuardIntervalToNanoSeconds(ns3::WifiMode mode, bool htShortGuardInterval, ns3::Time heGuardInterval) [free function]
     module.add_function('ConvertGuardIntervalToNanoSeconds', 
                         'uint16_t', 
                         [param('ns3::WifiMode', 'mode'), param('bool', 'htShortGuardInterval'), param('ns3::Time', 'heGuardInterval')])
@@ -27319,7 +27481,7 @@
     module.add_function('GetBlockAckSize', 
                         'uint32_t', 
                         [param('ns3::BlockAckType', 'type')])
-    ## wifi-utils.h (module 'wifi'): uint16_t ns3::GetChannelWidthForTransmission(ns3::WifiMode mode, uint16_t maxSupportedChannelWidth) [free function]
+    ## wifi-phy-common.h (module 'wifi'): uint16_t ns3::GetChannelWidthForTransmission(ns3::WifiMode mode, uint16_t maxSupportedChannelWidth) [free function]
     module.add_function('GetChannelWidthForTransmission', 
                         'uint16_t', 
                         [param('ns3::WifiMode', 'mode'), param('uint16_t', 'maxSupportedChannelWidth')])
@@ -27343,11 +27505,11 @@
     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]
+    ## wifi-phy-common.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) [free function]
+    ## wifi-phy-common.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')])
@@ -27363,24 +27525,24 @@
     module.add_function('GetTid', 
                         'uint8_t', 
                         [param('ns3::Ptr< ns3::Packet const >', 'packet'), param('ns3::WifiMacHeader const', 'hdr')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsAllowedControlAnswerModulationClass(ns3::WifiModulationClass modClassReq, ns3::WifiModulationClass modClassAnswer) [free function]
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsAllowedControlAnswerModulationClass(ns3::WifiModulationClass modClassReq, ns3::WifiModulationClass modClassAnswer) [free function]
     module.add_function('IsAllowedControlAnswerModulationClass', 
                         'bool', 
                         [param('ns3::WifiModulationClass', 'modClassReq'), param('ns3::WifiModulationClass', 'modClassAnswer')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsHe(ns3::WifiPreamble preamble) [free function]
-    module.add_function('IsHe', 
-                        'bool', 
-                        [param('ns3::WifiPreamble', 'preamble')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsHt(ns3::WifiPreamble preamble) [free function]
-    module.add_function('IsHt', 
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsDlMu(ns3::WifiPreamble preamble) [free function]
+    module.add_function('IsDlMu', 
                         'bool', 
                         [param('ns3::WifiPreamble', 'preamble')])
     ## wifi-utils.h (module 'wifi'): bool ns3::IsInWindow(uint16_t seq, uint16_t winstart, uint16_t winsize) [free function]
     module.add_function('IsInWindow', 
                         'bool', 
                         [param('uint16_t', 'seq'), param('uint16_t', 'winstart'), param('uint16_t', 'winsize')])
-    ## wifi-utils.h (module 'wifi'): bool ns3::IsVht(ns3::WifiPreamble preamble) [free function]
-    module.add_function('IsVht', 
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsMu(ns3::WifiPreamble preamble) [free function]
+    module.add_function('IsMu', 
+                        'bool', 
+                        [param('ns3::WifiPreamble', 'preamble')])
+    ## wifi-phy-common.h (module 'wifi'): bool ns3::IsUlMu(ns3::WifiPreamble preamble) [free function]
+    module.add_function('IsUlMu', 
                         'bool', 
                         [param('ns3::WifiPreamble', 'preamble')])
     ## ssid.h (module 'wifi'): ns3::Ptr<const ns3::AttributeChecker> ns3::MakeSsidChecker() [free function]
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/doc/source/wifi-design.rst ns-3.35/src/wifi/doc/source/wifi-design.rst
--- ns-3.34/src/wifi/doc/source/wifi-design.rst	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/doc/source/wifi-design.rst	2021-10-01 13:26:48.000000000 -0700
@@ -22,7 +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**
+* 802.11ax **DL OFDMA** and **UL OFDMA** (including support for the MU EDCA Parameter Set)
 * 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
@@ -164,7 +164,7 @@
 when the SpectrumWifiPhy is used.
 The following details pertain to the physical layer and channel models:
 
-* 802.11ax MU-RTS/CTS and the MU EDCA Parameter set are not yet supported
+* 802.11ax MU-RTS/CTS is 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
@@ -243,7 +243,7 @@
 also provides a number of callbacks for notifications of physical layer
 events, exposes a notion of a state machine that can be monitored for
 MAC-level processes such as carrier sense, and handles sleep/wake/off models
-and energy consumption.  The ``ns3::WifiPhy`` hooks to the ``ns3::MacLow``
+and energy consumption.  The ``ns3::WifiPhy`` hooks to the ``ns3::FrameExchangeManager``
 object in the WifiNetDevice.
 
 There are currently two implementations of the ``WifiPhy``: the
@@ -345,7 +345,7 @@
 ##################################
 
 Class ``ns3::YansWifiPhy`` is responsible for taking packets passed to
-it from the MAC (the ``ns3::MacLow`` object) and sending them onto the
+it from the MAC (the ``ns3::FrameExchangeManager`` object) and sending them onto the
 ``ns3::YansWifiChannel`` to which it is attached.  It is also responsible
 to receive packets from that channel, and, if reception is deemed to have
 been successful, to pass them up to the MAC. 
@@ -465,9 +465,9 @@
 The above describes the case in which the packet is a single MPDU.  For
 more recent Wi-Fi standards using MPDU aggregation, ``StartReceivePayload``
 schedules an event for reception of each individual MPDU (``ScheduleEndOfMpdus``),
-which then forwards each MPDU as they arrive up to MacLow, if the reception
-of the MPDU has been successful. Once the A-MPDU reception is finished,
-MacLow is also notified about the amount of successfully received MPDUs.
+which then forwards each MPDU as they arrive up to FrameExchangeManager, if the
+reception of the MPDU has been successful. Once the A-MPDU reception is finished,
+FrameExchangeManager is also notified about the amount of successfully received MPDUs.
 
 InterferenceHelper
 ##################
@@ -1205,8 +1205,8 @@
 * Creating or modifying the default Wi-Fi frames/headers by making changes to ``wifi-mac-header.*``.
 * MAC low modification. For example, handling new/modified control frames (think RTS/CTS/ACK/Block ACK),
   making changes to two-way transaction/four-way transaction.  Users usually make changes to 
-  ``mac-low.*`` to accomplish this.  Handling of control frames is performed in
-  ``MacLow::ReceiveOk``.
+  ``frame-exchange-manager.*`` or its subclasses to accomplish this.
+  Handling of control frames is performed in ``FrameExchangeManager::ReceiveMpdu``.
 * MAC high modification. For example, handling new management frames (think beacon/probe), 
   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.
@@ -1214,6 +1214,6 @@
   ``Txop`` and ``QosTxop``.
 * Fragmentation and RTS threholds are handled by Wi-Fi remote station manager.  Note that Wi-Fi remote
   station manager simply indicates if fragmentation and RTS are needed.  Fragmentation is handled by
-  ``Txop`` or ``QosTxop`` while RTS/CTS transaction is handled by ``MacLow``.
+  ``Txop`` or ``QosTxop`` while RTS/CTS transaction is handled by ``FrameExchangeManager``.
 * Modifying or creating new rate control algorithms can be done by creating a new child class of Wi-Fi remote
   station manager or modifying the existing ones.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/helper/athstats-helper.h ns-3.35/src/wifi/helper/athstats-helper.h
--- ns-3.34/src/wifi/helper/athstats-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/helper/athstats-helper.h	2021-10-01 13:26:48.000000000 -0700
@@ -22,6 +22,7 @@
 #define ATHSTATS_HELPER_H
 
 #include "ns3/wifi-phy-state.h"
+#include "ns3/wifi-phy-common.h"
 
 namespace ns3 {
 
@@ -30,6 +31,7 @@
 class NetDeviceContainer;
 class Packet;
 class Mac48Address;
+class WifiMode;
 
 /**
  * @brief create AthstatsWifiTraceSink instances and connect them to wifi devices
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/helper/spectrum-wifi-helper.cc ns-3.35/src/wifi/helper/spectrum-wifi-helper.cc
--- ns-3.34/src/wifi/helper/spectrum-wifi-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/helper/spectrum-wifi-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -61,13 +61,13 @@
   phy->SetErrorRateModel (error);
   if (m_frameCaptureModel.IsTypeIdSet ())
     {
-      Ptr<FrameCaptureModel> capture = m_frameCaptureModel.Create<FrameCaptureModel> ();
-      phy->SetFrameCaptureModel (capture);
+      auto frameCapture = m_frameCaptureModel.Create<FrameCaptureModel> ();
+      phy->SetFrameCaptureModel (frameCapture);
     }
   if (m_preambleDetectionModel.IsTypeIdSet ())
     {
-      Ptr<PreambleDetectionModel> capture = m_preambleDetectionModel.Create<PreambleDetectionModel> ();
-      phy->SetPreambleDetectionModel (capture);
+      auto preambleDetection = m_preambleDetectionModel.Create<PreambleDetectionModel> ();
+      phy->SetPreambleDetectionModel (preambleDetection);
     }
   phy->SetChannel (m_channel);
   phy->SetDevice (device);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/helper/wifi-helper.cc ns-3.35/src/wifi/helper/wifi-helper.cc
--- ns-3.34/src/wifi/helper/wifi-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/helper/wifi-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -769,37 +769,6 @@
   m_standard = standard;
 }
 
-// NS_DEPRECATED_3_32
-void
-WifiHelper::SetStandard (WifiPhyStandard standard)
-{
-  switch (standard)
-    {
-    case WIFI_PHY_STANDARD_80211a:
-      m_standard = WIFI_STANDARD_80211a;
-      return;
-    case WIFI_PHY_STANDARD_80211b:
-      m_standard = WIFI_STANDARD_80211b;
-      return;
-    case WIFI_PHY_STANDARD_80211g:
-      m_standard = WIFI_STANDARD_80211g;
-      return;
-    // remove the next value from WifiPhyStandard when deprecation ends
-    case WIFI_PHY_STANDARD_80211n_2_4GHZ:
-      m_standard = WIFI_STANDARD_80211n_2_4GHZ;
-      return;
-    // remove the next value from WifiPhyStandard when deprecation ends
-    case WIFI_PHY_STANDARD_80211n_5GHZ:
-      m_standard = WIFI_STANDARD_80211n_5GHZ;
-      return;
-    case WIFI_PHY_STANDARD_80211ac:
-      m_standard = WIFI_STANDARD_80211ac;
-      return;
-    default:
-      NS_FATAL_ERROR ("Unsupported value of WifiPhyStandard");
-    }
-}
-
 void
 WifiHelper::SetSelectQueueCallback (SelectQueueCallback f)
 {
@@ -839,11 +808,11 @@
           device->SetHeConfiguration (heConfiguration);
         }
       Ptr<WifiRemoteStationManager> manager = m_stationManager.Create<WifiRemoteStationManager> ();
-      Ptr<WifiMac> mac = macHelper.Create (device, m_standard);
       Ptr<WifiPhy> phy = phyHelper.Create (node, device);
       phy->ConfigureStandardAndBand (it->second.phyStandard, it->second.phyBand);
-      device->SetMac (mac);
       device->SetPhy (phy);
+      Ptr<WifiMac> mac = macHelper.Create (device, m_standard);
+      device->SetMac (mac);
       device->SetRemoteStationManager (manager);
       node->AddDevice (device);
       if ((it->second.phyStandard >= WIFI_PHY_STANDARD_80211ax) && (m_obssPdAlgorithm.IsTypeIdSet ()))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/helper/wifi-helper.h ns-3.35/src/wifi/helper/wifi-helper.h
--- ns-3.34/src/wifi/helper/wifi-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/helper/wifi-helper.h	2021-10-01 13:26:48.000000000 -0700
@@ -475,33 +475,6 @@
   virtual void SetStandard (WifiStandard standard);
 
   /**
-   * \param standard the PHY standard to configure during installation
-   *
-   * This method sets standards-compliant defaults for WifiMac
-   * parameters such as SIFS time, slot time, timeout values, etc.,
-   * based on the standard selected.  It results in
-   * WifiMac::ConfigureStandard(standard) being called on each
-   * installed MAC object.
-   *
-   * The default standard of 802.11a will be applied if SetStandard()
-   * is not called.
-   *
-   * Note that WifiMac::ConfigureStandard () will overwrite certain
-   * defaults in the attribute system, so if a user wants to manipulate
-   * any default values affected by ConfigureStandard() while using this
-   * helper, the user should use a post-install configuration such as
-   * Config::Set() on any objects that this helper creates, such as:
-   * \code
-   * Config::Set ("/NodeList/0/DeviceList/0/$ns3::WifiNetDevice/Mac/Slot", TimeValue (MicroSeconds (slot)));
-   * \endcode
-   * \deprecated This method will go away in future release of ns-3.
-   *
-   * \sa Config::Set
-   */
-  NS_DEPRECATED_3_32
-  virtual void SetStandard (WifiPhyStandard standard);
-
-  /**
    * Helper to enable all WifiNetDevice log components with one statement
    */
   static void EnableLogComponents (void);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/helper/wifi-mac-helper.h ns-3.35/src/wifi/helper/wifi-mac-helper.h
--- ns-3.34/src/wifi/helper/wifi-mac-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/helper/wifi-mac-helper.h	2021-10-01 13:26:48.000000000 -0700
@@ -35,7 +35,7 @@
  * This class can create MACs of type ns3::ApWifiMac, ns3::StaWifiMac and ns3::AdhocWifiMac.
  * Its purpose is to allow a WifiHelper to configure and install WifiMac objects on a collection
  * of nodes. The WifiMac objects themselves are mainly composed of TxMiddle, RxMiddle, ChannelAccessManager,
- * MacLow, WifiRemoteStationManager, MpduAggregator and MsduAggregartor objects, so this helper
+ * FrameExchangeManager, WifiRemoteStationManager, MpduAggregator and MsduAggregartor objects, so this helper
  * offers the opportunity to configure attribute values away from their default values, on a
  * per-NodeContainer basis. By default, it creates an Adhoc MAC layer without QoS. Typically,
  * it is used to set type and attribute values, then hand this object over to the WifiHelper that
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/helper/yans-wifi-helper.cc ns-3.35/src/wifi/helper/yans-wifi-helper.cc
--- ns-3.34/src/wifi/helper/yans-wifi-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/helper/yans-wifi-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -151,13 +151,13 @@
   phy->SetErrorRateModel (error);
   if (m_frameCaptureModel.IsTypeIdSet ())
     {
-      Ptr<FrameCaptureModel> capture = m_frameCaptureModel.Create<FrameCaptureModel> ();
-      phy->SetFrameCaptureModel (capture);
+      auto frameCapture = m_frameCaptureModel.Create<FrameCaptureModel> ();
+      phy->SetFrameCaptureModel (frameCapture);
     }
   if (m_preambleDetectionModel.IsTypeIdSet ())
     {
-      Ptr<PreambleDetectionModel> capture = m_preambleDetectionModel.Create<PreambleDetectionModel> ();
-      phy->SetPreambleDetectionModel (capture);
+      auto preambleDetection = m_preambleDetectionModel.Create<PreambleDetectionModel> ();
+      phy->SetPreambleDetectionModel (preambleDetection);
     }
   phy->SetChannel (m_channel);
   phy->SetDevice (device);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/ap-wifi-mac.cc ns-3.35/src/wifi/model/ap-wifi-mac.cc
--- ns-3.34/src/wifi/model/ap-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/ap-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
@@ -35,6 +35,7 @@
 #include "amsdu-subframe-header.h"
 #include "wifi-phy.h"
 #include "wifi-net-device.h"
+#include "wifi-mac-queue.h"
 #include "ns3/ht-configuration.h"
 #include "ns3/he-configuration.h"
 
@@ -103,7 +104,8 @@
     m_shortPreambleEnabled (false)
 {
   NS_LOG_FUNCTION (this);
-  m_beaconTxop = CreateObject<Txop> ();
+  m_beaconTxop = CreateObject<Txop> (CreateObject<WifiMacQueue> (AC_BEACON));
+  m_beaconTxop->SetWifiMac (this);
   m_beaconTxop->SetAifsn (1);
   m_beaconTxop->SetMinCw (0);
   m_beaconTxop->SetMaxCw (0);
@@ -118,7 +120,6 @@
 {
   NS_LOG_FUNCTION (this);
   m_staList.clear ();
-  m_addressIdMap.clear ();
 }
 
 void
@@ -142,6 +143,16 @@
   RegularWifiMac::SetBssid (address);
 }
 
+Ptr<WifiMacQueue>
+ApWifiMac::GetTxopQueue (AcIndex ac) const
+{
+  if (ac == AC_BEACON)
+    {
+      return m_beaconTxop->GetWifiMacQueue ();
+    }
+  return RegularWifiMac::GetTxopQueue (ac);
+}
+
 void
 ApWifiMac::SetBeaconGeneration (bool enable)
 {
@@ -165,14 +176,6 @@
 }
 
 void
-ApWifiMac::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> stationManager)
-{
-  NS_LOG_FUNCTION (this << stationManager);
-  m_beaconTxop->SetWifiRemoteStationManager (stationManager);
-  RegularWifiMac::SetWifiRemoteStationManager (stationManager);
-}
-
-void
 ApWifiMac::SetLinkUpCallback (Callback<void> linkUp)
 {
   NS_LOG_FUNCTION (this << &linkUp);
@@ -513,6 +516,60 @@
   return edcaParameters;
 }
 
+MuEdcaParameterSet
+ApWifiMac::GetMuEdcaParameterSet (void) const
+{
+  NS_LOG_FUNCTION (this);
+  MuEdcaParameterSet muEdcaParameters;
+  if (GetHeSupported ())
+    {
+      Ptr<HeConfiguration> heConfiguration = GetHeConfiguration ();
+      NS_ASSERT (heConfiguration != 0);
+
+      muEdcaParameters.SetQosInfo (0);
+
+      UintegerValue uintegerValue;
+      TimeValue timeValue;
+
+      heConfiguration->GetAttribute ("MuBeAifsn", uintegerValue);
+      muEdcaParameters.SetMuAifsn (AC_BE, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuBeCwMin", uintegerValue);
+      muEdcaParameters.SetMuCwMin (AC_BE, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuBeCwMax", uintegerValue);
+      muEdcaParameters.SetMuCwMax (AC_BE, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("BeMuEdcaTimer", timeValue);
+      muEdcaParameters.SetMuEdcaTimer (AC_BE, timeValue.Get ());
+
+      heConfiguration->GetAttribute ("MuBkAifsn", uintegerValue);
+      muEdcaParameters.SetMuAifsn (AC_BK, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuBkCwMin", uintegerValue);
+      muEdcaParameters.SetMuCwMin (AC_BK, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuBkCwMax", uintegerValue);
+      muEdcaParameters.SetMuCwMax (AC_BK, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("BkMuEdcaTimer", timeValue);
+      muEdcaParameters.SetMuEdcaTimer (AC_BK, timeValue.Get ());
+
+      heConfiguration->GetAttribute ("MuViAifsn", uintegerValue);
+      muEdcaParameters.SetMuAifsn (AC_VI, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuViCwMin", uintegerValue);
+      muEdcaParameters.SetMuCwMin (AC_VI, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuViCwMax", uintegerValue);
+      muEdcaParameters.SetMuCwMax (AC_VI, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("ViMuEdcaTimer", timeValue);
+      muEdcaParameters.SetMuEdcaTimer (AC_VI, timeValue.Get ());
+
+      heConfiguration->GetAttribute ("MuVoAifsn", uintegerValue);
+      muEdcaParameters.SetMuAifsn (AC_VO, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuVoCwMin", uintegerValue);
+      muEdcaParameters.SetMuCwMin (AC_VO, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("MuVoCwMax", uintegerValue);
+      muEdcaParameters.SetMuCwMax (AC_VO, uintegerValue.Get ());
+      heConfiguration->GetAttribute ("VoMuEdcaTimer", timeValue);
+      muEdcaParameters.SetMuEdcaTimer (AC_VO, timeValue.Get ());
+    }
+  return muEdcaParameters;
+}
+
 HtOperation
 ApWifiMac::GetHtOperation (void) const
 {
@@ -717,6 +774,7 @@
     {
       probe.SetHeCapabilities (GetHeCapabilities ());
       probe.SetHeOperation (GetHeOperation ());
+      probe.SetMuEdcaParameterSet (GetMuEdcaParameterSet ());
     }
   packet->AddHeader (probe);
 
@@ -763,7 +821,7 @@
           aid = GetNextAssociationId ();
           m_staList.insert (std::make_pair (aid, to));
           m_assocLogger (aid, to);
-          m_addressIdMap.insert (std::make_pair (to, aid));
+          m_stationManager->SetAssociationId (to, aid);
           if (m_stationManager->GetDsssSupported (to) && !m_stationManager->GetErpOfdmSupported (to))
             {
               m_numNonErpStations++;
@@ -807,6 +865,7 @@
     {
       assoc.SetHeCapabilities (GetHeCapabilities ());
       assoc.SetHeOperation (GetHeOperation ());
+      assoc.SetMuEdcaParameterSet (GetMuEdcaParameterSet ());
     }
   packet->AddHeader (assoc);
 
@@ -863,6 +922,7 @@
     {
       beacon.SetHeCapabilities (GetHeCapabilities ());
       beacon.SetHeOperation (GetHeOperation ());
+      beacon.SetMuEdcaParameterSet (GetMuEdcaParameterSet ());
     }
   packet->AddHeader (beacon);
 
@@ -1294,7 +1354,6 @@
                     {
                       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--;
@@ -1399,13 +1458,7 @@
 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;
+  return m_stationManager->GetAssociationId (addr);
 }
 
 uint8_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/ap-wifi-mac.h ns-3.35/src/wifi/model/ap-wifi-mac.h
--- ns-3.34/src/wifi/model/ap-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/ap-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
@@ -33,6 +33,7 @@
 class DsssParameterSet;
 class ErpInformation;
 class EdcaParameterSet;
+class MuEdcaParameterSet;
 class HtOperation;
 class VhtOperation;
 class HeOperation;
@@ -57,12 +58,12 @@
   ApWifiMac ();
   virtual ~ApWifiMac ();
 
-  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;
+  Ptr<WifiMacQueue> GetTxopQueue (AcIndex ac) const override;
 
   /**
    * \param interval the interval between two beacon transmissions.
@@ -233,6 +234,12 @@
    */
   EdcaParameterSet GetEdcaParameterSet (void) const;
   /**
+   * Return the MU EDCA Parameter Set of the current AP.
+   *
+   * \return the MU EDCA Parameter Set that we support
+   */
+  MuEdcaParameterSet GetMuEdcaParameterSet (void) const;
+  /**
    * Return the HT operation of the current AP.
    *
    * \return the HT operation that we support
@@ -307,8 +314,6 @@
   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
-  /// 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
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/block-ack-agreement.h ns-3.35/src/wifi/model/block-ack-agreement.h
--- ns-3.34/src/wifi/model/block-ack-agreement.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/block-ack-agreement.h	2021-10-01 13:26:48.000000000 -0700
@@ -32,8 +32,6 @@
  */
 class BlockAckAgreement
 {
-  /// Provide access to MacLow class
-  friend class MacLow;
   friend class HtFrameExchangeManager;
 
 public:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/block-ack-manager.cc ns-3.35/src/wifi/model/block-ack-manager.cc
--- ns-3.34/src/wifi/model/block-ack-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/block-ack-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -21,7 +21,7 @@
 #include "ns3/log.h"
 #include "ns3/simulator.h"
 #include "block-ack-manager.h"
-#include "wifi-remote-station-manager.h"
+#include "wifi-utils.h"
 #include "ctrl-headers.h"
 #include "mgt-headers.h"
 #include "wifi-mac-queue.h"
@@ -65,16 +65,20 @@
 BlockAckManager::BlockAckManager ()
 {
   NS_LOG_FUNCTION (this);
-  m_retryPackets = CreateObject<WifiMacQueue> ();
-  m_retryPackets->TraceConnectWithoutContext ("Expired", MakeCallback (&BlockAckManager::NotifyDiscardedMpdu, this));
 }
 
 BlockAckManager::~BlockAckManager ()
 {
   NS_LOG_FUNCTION (this);
-  m_queue = 0;
+}
+
+void
+BlockAckManager::DoDispose ()
+{
+  NS_LOG_FUNCTION (this);
   m_agreements.clear ();
-  m_retryPackets = 0;
+  m_bars.clear ();
+  m_queue = nullptr;
 }
 
 bool
@@ -112,9 +116,9 @@
 }
 
 void
-BlockAckManager::CreateAgreement (const MgtAddBaRequestHeader *reqHdr, Mac48Address recipient)
+BlockAckManager::CreateAgreement (const MgtAddBaRequestHeader *reqHdr, Mac48Address recipient, bool htSupported)
 {
-  NS_LOG_FUNCTION (this << reqHdr << recipient);
+  NS_LOG_FUNCTION (this << reqHdr << recipient << htSupported);
   std::pair<Mac48Address, uint8_t> key (recipient, reqHdr->GetTid ());
   OriginatorBlockAckAgreement agreement (recipient, reqHdr->GetTid ());
   agreement.SetStartingSequence (reqHdr->GetStartingSequence ());
@@ -123,7 +127,7 @@
   agreement.SetBufferSize (reqHdr->GetBufferSize());
   agreement.SetTimeout (reqHdr->GetTimeout ());
   agreement.SetAmsduSupport (reqHdr->IsAmsduSupported ());
-  agreement.SetHtSupported (m_stationManager->GetHtSupported () && m_stationManager->GetHtSupported (recipient));
+  agreement.SetHtSupported (htSupported);
   if (reqHdr->IsImmediateBlockAck ())
     {
       agreement.SetImmediateBlockAck ();
@@ -154,17 +158,6 @@
   AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
   if (it != m_agreements.end ())
     {
-      for (WifiMacQueue::ConstIterator i = m_retryPackets->begin (); i != m_retryPackets->end (); )
-        {
-          if ((*i)->GetHeader ().GetAddr1 () == recipient && (*i)->GetHeader ().GetQosTid () == tid)
-            {
-              i = m_retryPackets->Remove (i);
-            }
-          else
-            {
-              i++;
-            }
-        }
       m_agreements.erase (it);
       //remove scheduled BAR
       for (std::list<Bar>::const_iterator i = m_bars.begin (); i != m_bars.end (); )
@@ -221,12 +214,6 @@
   m_unblockPackets (recipient, tid);
 }
 
-Ptr<WifiMacQueue>
-BlockAckManager::GetRetransmitQueue (void)
-{
-  return m_retryPackets;
-}
-
 void
 BlockAckManager::StorePacket (Ptr<WifiMacQueueItem> mpdu)
 {
@@ -270,15 +257,17 @@
     }
   agreementIt->second.second.insert (it, mpdu);
   agreementIt->second.first.NotifyTransmittedMpdu (mpdu);
+  mpdu->SetInFlight ();
 }
 
 Ptr<const WifiMacQueueItem>
 BlockAckManager::GetBar (bool remove, uint8_t tid, Mac48Address address)
 {
+  Time now = Simulator::Now ();
   Ptr<const WifiMacQueueItem> bar;
-  // remove all expired MPDUs in the retransmission queue, so that Block Ack Requests
-  // (if needed) are scheduled
-  m_retryPackets->Remove (WifiMacQueue::EMPTY, true);
+  // remove all expired MPDUs from the head of the MAC queue, so that
+  // BlockAckRequest frames (if needed) are scheduled
+  m_queue->IsEmpty ();
 
   auto nextBar = m_bars.begin ();
 
@@ -304,7 +293,6 @@
               continue;
             }
           if (nextBar->skipIfNoDataQueued
-              && m_retryPackets->PeekByTidAndAddress (nextBar->tid, recipient) == m_retryPackets->end ()
               && m_queue->PeekByTidAndAddress (nextBar->tid, recipient) == m_queue->end ())
             {
               // skip this BAR as there is no data queued
@@ -314,15 +302,30 @@
           // remove expired outstanding MPDUs and update the starting sequence number
           for (auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
             {
-              if ((*mpduIt)->GetTimeStamp () + m_queue->GetMaxDelay () <= Simulator::Now ())
+              if (!(*mpduIt)->IsQueued ())
+                {
+                  // the MPDU is no longer in the EDCA queue
+                  mpduIt = it->second.second.erase (mpduIt);
+                  continue;
+                }
+
+              WifiMacQueue::ConstIterator queueIt = (*mpduIt)->GetQueueIterator ();
+
+              if ((*mpduIt)->GetTimeStamp () + m_queue->GetMaxDelay () <= now)
                 {
                   // MPDU expired
                   it->second.first.NotifyDiscardedMpdu (*mpduIt);
+                  // Remove from the EDCA queue and fire the Expired trace source, but the
+                  // consequent call to NotifyDiscardedMpdu does nothing (in particular,
+                  // does not schedule a BAR) because we have advanced the transmit window
+                  // and hence this MPDU became an old packet
+                  m_queue->TtlExceeded (queueIt, now);
                   mpduIt = it->second.second.erase (mpduIt);
                 }
               else
                 {
-                  mpduIt++;
+                  // MPDUs are typically in increasing order of remaining lifetime
+                  break;
                 }
             }
           // update BAR if the starting sequence number changed
@@ -347,13 +350,6 @@
   return bar;
 }
 
-bool
-BlockAckManager::HasPackets (void)
-{
-  NS_LOG_FUNCTION (this);
-  return (!m_retryPackets->IsEmpty () || GetBar (false) != 0);
-}
-
 uint32_t
 BlockAckManager::GetNBufferedPackets (Mac48Address recipient, uint8_t tid) const
 {
@@ -363,19 +359,7 @@
     {
       return 0;
     }
-  uint32_t nPackets = 0;
-  PacketQueueCI queueIt = (*it).second.second.begin ();
-  while (queueIt != (*it).second.second.end ())
-    {
-      uint16_t currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
-      nPackets++;
-      /* a fragmented packet must be counted as one packet */
-      while (queueIt != (*it).second.second.end () && (*queueIt)->GetHeader ().GetSequenceNumber () == currentSeq)
-        {
-          queueIt++;
-        }
-    }
-  return nPackets;
+  return it->second.second.size ();
 }
 
 void
@@ -385,11 +369,66 @@
   m_blockAckThreshold = nPackets;
 }
 
-void
-BlockAckManager::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> manager)
+BlockAckManager::PacketQueueI
+BlockAckManager::HandleInFlightMpdu (PacketQueueI mpduIt, MpduStatus status,
+                                     const AgreementsI& it, const Time& now)
 {
-  NS_LOG_FUNCTION (this << manager);
-  m_stationManager = manager;
+  NS_LOG_FUNCTION (this << **mpduIt << +static_cast<uint8_t> (status));
+
+  if (!(*mpduIt)->IsQueued ())
+    {
+      // MPDU is not in the EDCA queue (e.g., its lifetime expired and it was
+      // removed by another method), remove from the queue of in flight MPDUs
+      NS_LOG_DEBUG ("MPDU is not stored in the EDCA queue, drop MPDU");
+      return it->second.second.erase (mpduIt);
+    }
+
+  if (status == ACKNOWLEDGED)
+    {
+      // the MPDU has to be dequeued from the EDCA queue
+      m_queue->DequeueIfQueued (*mpduIt);
+      return it->second.second.erase (mpduIt);
+    }
+
+  WifiMacHeader& hdr = (*mpduIt)->GetHeader ();
+  WifiMacQueue::ConstIterator queueIt = (*mpduIt)->GetQueueIterator ();
+
+  NS_ASSERT (hdr.GetAddr1 () == it->first.first);
+  NS_ASSERT (hdr.IsQosData () && hdr.GetQosTid () == it->first.second);
+
+  if (it->second.first.GetDistance (hdr.GetSequenceNumber ()) >= SEQNO_SPACE_HALF_SIZE)
+    {
+      NS_LOG_DEBUG ("Old packet. Remove from the EDCA queue, too");
+      if (!m_droppedOldMpduCallback.IsNull ())
+        {
+          m_droppedOldMpduCallback (*queueIt);
+        }
+      m_queue->Remove (queueIt);
+      return it->second.second.erase (mpduIt);
+    }
+
+  auto nextIt = std::next (mpduIt);
+
+  if (m_queue->TtlExceeded (queueIt, now))
+    {
+      // WifiMacQueue::TtlExceeded() has removed the MPDU from the EDCA queue
+      // and fired the Expired trace source, which called NotifyDiscardedMpdu,
+      // which removed this MPDU from the in flight queue as well
+      NS_LOG_DEBUG ("MSDU lifetime expired, drop MPDU");
+      return nextIt;
+    }
+
+  if (status == STAY_INFLIGHT)
+    {
+      // the MPDU has to stay in flight, do nothing
+      return ++mpduIt;
+    }
+
+  NS_ASSERT (status == TO_RETRANSMIT);
+  (*mpduIt)->GetHeader ().SetRetry ();
+  (*mpduIt)->ResetInFlight ();  // no longer in flight; will be if retransmitted
+
+  return it->second.second.erase (mpduIt);
 }
 
 void
@@ -406,17 +445,13 @@
   NS_ASSERT (it != m_agreements.end ());
 
   // remove the acknowledged frame from the queue of outstanding packets
-  PacketQueueI queueIt = it->second.second.begin ();
-  while (queueIt != it->second.second.end ())
+  for (auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); ++queueIt)
     {
       if ((*queueIt)->GetHeader ().GetSequenceNumber () == mpdu->GetHeader ().GetSequenceNumber ())
         {
-          queueIt = it->second.second.erase (queueIt);
+          HandleInFlightMpdu (queueIt, ACKNOWLEDGED, it, Simulator::Now ());
+          break;
         }
-      else
-      {
-        queueIt++;
-      }
     }
 
   it->second.first.NotifyAckedMpdu (mpdu);
@@ -437,127 +472,80 @@
 
   // remove the frame from the queue of outstanding packets (it will be re-inserted
   // if retransmitted)
-  PacketQueueI queueIt = it->second.second.begin ();
-  while (queueIt != it->second.second.end ())
+  for (auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); ++queueIt)
     {
       if ((*queueIt)->GetHeader ().GetSequenceNumber () == mpdu->GetHeader ().GetSequenceNumber ())
         {
-          queueIt = it->second.second.erase (queueIt);
+          HandleInFlightMpdu (queueIt, TO_RETRANSMIT, it, Simulator::Now ());
+          break;
         }
-      else
-      {
-        queueIt++;
-      }
     }
-
-  // insert in the retransmission queue
-  InsertInRetryQueue (mpdu);
 }
 
-void
+std::pair<uint16_t,uint16_t>
 BlockAckManager::NotifyGotBlockAck (const CtrlBAckResponseHeader& blockAck, Mac48Address recipient,
-                                    const std::set<uint8_t>& tids, double rxSnr, double dataSnr,
-                                    const WifiTxVector& dataTxVector, size_t index)
+                                    const std::set<uint8_t>& tids, size_t index)
 {
-  NS_LOG_FUNCTION (this << blockAck << recipient << rxSnr << dataSnr << dataTxVector << index);
-  if (!blockAck.IsMultiTid ())
+  NS_LOG_FUNCTION (this << blockAck << recipient << index);
+  uint16_t nSuccessfulMpdus = 0;
+  uint16_t nFailedMpdus = 0;
+
+  NS_ABORT_MSG_IF (blockAck.IsBasic (), "Basic Block Ack is not supported");
+  NS_ABORT_MSG_IF (blockAck.IsMultiTid (), "Multi-TID Block Ack is not supported");
+
+  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)
     {
-      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;
-          uint16_t nSuccessfulMpdus = 0;
-          uint16_t nFailedMpdus = 0;
-          AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
-          PacketQueueI queueEnd = it->second.second.end ();
-
-          if (it->second.first.m_inactivityEvent.IsRunning ())
-            {
-              /* Upon reception of a BlockAck frame, the inactivity timer at the
-                 originator must be reset.
-                 For more details see section 11.5.3 in IEEE802.11e standard */
-              it->second.first.m_inactivityEvent.Cancel ();
-              Time timeout = MicroSeconds (1024 * it->second.first.GetTimeout ());
-              it->second.first.m_inactivityEvent = Simulator::Schedule (timeout,
-                                                                        &BlockAckManager::InactivityTimeout,
-                                                                        this,
-                                                                        recipient, tid);
-            }
-
-          uint16_t currentStartingSeq = it->second.first.GetStartingSequence ();
-          uint16_t currentSeq = SEQNO_SPACE_SIZE;   // invalid value
+      NS_ASSERT (blockAck.GetAckType (index) && tids.size () == 1);
+      tid = *tids.begin ();
+    }
+  if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
+    {
+      AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
 
-          if (blockAck.IsBasic ())
-            {
-              for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd; )
-                {
-                  currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
-                  if (blockAck.IsFragmentReceived (currentSeq,
-                                                    (*queueIt)->GetHeader ().GetFragmentNumber ()))
-                    {
-                      nSuccessfulMpdus++;
-                    }
-                  else if (!QosUtilsIsOldPacket (currentStartingSeq, currentSeq))
-                    {
-                      if (!foundFirstLost)
-                        {
-                          foundFirstLost = true;
-                          RemoveOldPackets (recipient, tid, currentSeq);
-                        }
-                      nFailedMpdus++;
-                      InsertInRetryQueue (*queueIt);
-                    }
-                  // in any case, this packet is no longer outstanding
-                  queueIt = it->second.second.erase (queueIt);
-                }
-              // If all frames were acknowledged, move the transmit window past the last one
-              if (!foundFirstLost && currentSeq != SEQNO_SPACE_SIZE)
+      if (it->second.first.m_inactivityEvent.IsRunning ())
+        {
+          /* Upon reception of a BlockAck frame, the inactivity timer at the
+              originator must be reset.
+              For more details see section 11.5.3 in IEEE802.11e standard */
+          it->second.first.m_inactivityEvent.Cancel ();
+          Time timeout = MicroSeconds (1024 * it->second.first.GetTimeout ());
+          it->second.first.m_inactivityEvent = Simulator::Schedule (timeout,
+                                                                    &BlockAckManager::InactivityTimeout,
+                                                                    this,
+                                                                    recipient, tid);
+        }
+
+      NS_ASSERT (blockAck.IsCompressed () || blockAck.IsExtendedCompressed () || blockAck.IsMultiSta ());
+      Time now = Simulator::Now ();
+
+      for (auto queueIt = it->second.second.begin (); queueIt != it->second.second.end (); )
+        {
+          uint16_t currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
+          if (blockAck.IsPacketReceived (currentSeq, index))
+            {
+              it->second.first.NotifyAckedMpdu (*queueIt);
+              nSuccessfulMpdus++;
+              if (!m_txOkCallback.IsNull ())
                 {
-                  RemoveOldPackets (recipient, tid, (currentSeq + 1) % SEQNO_SPACE_SIZE);
+                  m_txOkCallback (*queueIt);
                 }
+              queueIt = HandleInFlightMpdu (queueIt, ACKNOWLEDGED, it, now);
             }
-          else if (blockAck.IsCompressed () || blockAck.IsExtendedCompressed () || blockAck.IsMultiSta ())
+          else
             {
-              for (PacketQueueI queueIt = it->second.second.begin (); queueIt != queueEnd; )
+              nFailedMpdus++;
+              if (!m_txFailedCallback.IsNull ())
                 {
-                  currentSeq = (*queueIt)->GetHeader ().GetSequenceNumber ();
-                  if (blockAck.IsPacketReceived (currentSeq, index))
-                    {
-                      it->second.first.NotifyAckedMpdu (*queueIt);
-                      nSuccessfulMpdus++;
-                      if (!m_txOkCallback.IsNull ())
-                        {
-                          m_txOkCallback (*queueIt);
-                        }
-                    }
-                  else if (!QosUtilsIsOldPacket (currentStartingSeq, currentSeq))
-                    {
-                      nFailedMpdus++;
-                      if (!m_txFailedCallback.IsNull ())
-                        {
-                          m_txFailedCallback (*queueIt);
-                        }
-                      InsertInRetryQueue (*queueIt);
-                    }
-                  // in any case, this packet is no longer outstanding
-                  queueIt = it->second.second.erase (queueIt);
+                  m_txFailedCallback (*queueIt);
                 }
+              queueIt = HandleInFlightMpdu (queueIt, TO_RETRANSMIT, it, now);
             }
-          m_stationManager->ReportAmpduTxStatus (recipient, nSuccessfulMpdus, nFailedMpdus, rxSnr, dataSnr, dataTxVector);
         }
     }
-  else
-    {
-      //NOT SUPPORTED FOR NOW
-      NS_FATAL_ERROR ("Multi-tid block ack is not supported.");
-    }
+  return {nSuccessfulMpdus, nFailedMpdus};
 }
   
 void
@@ -567,36 +555,13 @@
   if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
     {
       AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
-      for (auto& item : it->second.second)
-        {
-          // Queue previously transmitted packets that do not already exist in the retry queue.
-          InsertInRetryQueue (item);
-        }
+      Time now = Simulator::Now ();
+
       // remove all packets from the queue of outstanding packets (they will be
       // re-inserted if retransmitted)
-      it->second.second.clear ();
-    }
-}
-
-void
-BlockAckManager::DiscardOutstandingMpdus (Mac48Address recipient, uint8_t tid)
-{
-  NS_LOG_FUNCTION (this << recipient << +tid);
-  if (ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
-    {
-      AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
-      while (!it->second.second.empty ())
+      for (auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
         {
-          Ptr<WifiMacQueueItem> mpdu = it->second.second.front ();
-          if (it->second.first.GetDistance (mpdu->GetHeader ().GetSequenceNumber ()) >= SEQNO_SPACE_HALF_SIZE)
-            {
-              // old packet
-              it->second.second.pop_front ();
-            }
-          else
-            {
-              NotifyDiscardedMpdu (mpdu);
-            }
+          mpduIt = HandleInFlightMpdu (mpduIt, TO_RETRANSMIT, it, now);
         }
     }
 }
@@ -612,6 +577,12 @@
       return;
     }
 
+  if (!mpdu->GetHeader ().IsRetry () && !mpdu->IsInFlight ())
+    {
+      NS_LOG_DEBUG ("This frame has never been transmitted");
+      return;
+    }
+
   Mac48Address recipient = mpdu->GetHeader ().GetAddr1 ();
   uint8_t tid = mpdu->GetHeader ().GetQosTid ();
   if (!ExistsAgreementInState (recipient, tid, OriginatorBlockAckAgreement::ESTABLISHED))
@@ -628,12 +599,28 @@
       return;
     }
 
-  // remove outstanding frames and frames in the retransmit queue with a sequence
-  // number less than or equal to the discarded MPDU
-  RemoveOldPackets (recipient, tid, (mpdu->GetHeader ().GetSequenceNumber () + 1) % SEQNO_SPACE_SIZE);
   // actually advance the transmit window
   it->second.first.NotifyDiscardedMpdu (mpdu);
 
+  // remove old MPDUs from the EDCA queue and from the in flight queue
+  // (including the given MPDU which became old after advancing the transmit window)
+  for (auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
+    {
+      if (it->second.first.GetDistance ((*mpduIt)->GetHeader ().GetSequenceNumber ()) >= SEQNO_SPACE_HALF_SIZE)
+        {
+          m_queue->DequeueIfQueued (*mpduIt);
+          if (!m_droppedOldMpduCallback.IsNull ())
+            {
+              m_droppedOldMpduCallback (*mpduIt);
+            }
+          mpduIt = it->second.second.erase (mpduIt);
+        }
+      else
+        {
+          break; // MPDUs are in increasing order of sequence number in the in flight queue
+        }
+    }
+
   // schedule a BlockAckRequest
   NS_LOG_DEBUG ("Schedule a Block Ack Request for agreement (" << recipient << ", " << +tid << ")");
   Ptr<Packet> bar = Create<Packet> ();
@@ -808,11 +795,17 @@
       AgreementsI it = m_agreements.find (std::make_pair (recipient, tid));
       NS_ASSERT (it != m_agreements.end ());
 
-      // A BAR needs to be retransmitted if there is at least a non-expired outstanding MPDU
-      for (auto& mpdu : it->second.second)
+      Time now = Simulator::Now ();
+
+      // A BAR needs to be retransmitted if there is at least a non-expired in flight MPDU
+      for (auto mpduIt = it->second.second.begin (); mpduIt != it->second.second.end (); )
         {
-          if (mpdu->GetTimeStamp () + m_queue->GetMaxDelay () > Simulator::Now ())
+          // remove MPDU if old or with expired lifetime
+          mpduIt = HandleInFlightMpdu (mpduIt, STAY_INFLIGHT, it, now);
+
+          if (mpduIt != it->second.second.begin ())
             {
+              // the MPDU has not been removed
               return true;
             }
         }
@@ -824,80 +817,6 @@
 }
 
 void
-BlockAckManager::RemoveFromRetryQueue (Mac48Address address, uint8_t tid, uint16_t seq)
-{
-  RemoveFromRetryQueue (address, tid, seq, seq);
-}
-
-void
-BlockAckManager::RemoveFromRetryQueue (Mac48Address address, uint8_t tid, uint16_t startSeq, uint16_t endSeq)
-{
-  NS_LOG_FUNCTION (this << address << +tid << startSeq << endSeq);
-
-  AgreementsI agreementIt = m_agreements.find (std::make_pair (address, tid));
-  NS_ASSERT (agreementIt != m_agreements.end ());
-
-  /* remove retry packet iterators if they are present in retry queue */
-  WifiMacQueue::ConstIterator it = m_retryPackets->PeekByTidAndAddress (tid, address);
-
-  while (it != m_retryPackets->end ())
-    {
-      uint16_t itSeq = (*it)->GetHeader ().GetSequenceNumber ();
-
-      if (agreementIt->second.first.GetDistance (itSeq) >= agreementIt->second.first.GetDistance (startSeq)
-          && agreementIt->second.first.GetDistance (itSeq) <= agreementIt->second.first.GetDistance (endSeq))
-        {
-          NS_LOG_DEBUG ("Removing frame with seqnum = " << itSeq);
-          it = m_retryPackets->Remove (it);
-          it = m_retryPackets->PeekByTidAndAddress (tid, address, it);
-        }
-      else
-        {
-          it = m_retryPackets->PeekByTidAndAddress (tid, address, ++it);
-        }
-    }
-}
-
-void
-BlockAckManager::RemoveOldPackets (Mac48Address recipient, uint8_t tid, uint16_t startingSeq)
-{
-  NS_LOG_FUNCTION (this << recipient << +tid << startingSeq);
-
-  AgreementsI agreementIt = m_agreements.find (std::make_pair (recipient, tid));
-  NS_ASSERT (agreementIt != m_agreements.end ());
-  uint16_t currStartingSeq = agreementIt->second.first.GetStartingSequence ();
-
-  NS_ABORT_MSG_IF (agreementIt->second.first.GetDistance (startingSeq) >= SEQNO_SPACE_HALF_SIZE,
-                   "The new starting sequence number is an old sequence number");
-
-  if (startingSeq == currStartingSeq)
-    {
-      return;
-    }
-
-  // remove packets that will become old from the retransmission queue
-  uint16_t lastRemovedSeq = (startingSeq - 1 + SEQNO_SPACE_SIZE) % SEQNO_SPACE_SIZE;
-  RemoveFromRetryQueue (recipient, tid, currStartingSeq, lastRemovedSeq);
-
-  // remove packets that will become old from the queue of outstanding packets
-  PacketQueueI it = agreementIt->second.second.begin ();
-  while (it != agreementIt->second.second.end ())
-    {
-      uint16_t itSeq = (*it)->GetHeader ().GetSequenceNumber ();
-
-      if (agreementIt->second.first.GetDistance (itSeq) <= agreementIt->second.first.GetDistance (lastRemovedSeq))
-        {
-          NS_LOG_DEBUG ("Removing frame with seqnum = " << itSeq);
-          it = agreementIt->second.second.erase (it);
-        }
-      else
-        {
-          it++;
-        }
-    }
-}
-
-void
 BlockAckManager::SetBlockAckInactivityCallback (Callback<void, Mac48Address, uint8_t, bool> callback)
 {
   NS_LOG_FUNCTION (this << &callback);
@@ -931,47 +850,9 @@
 }
 
 void
-BlockAckManager::InsertInRetryQueue (Ptr<WifiMacQueueItem> mpdu)
+BlockAckManager::SetDroppedOldMpduCallback (DroppedOldMpdu callback)
 {
-  NS_LOG_INFO ("Adding to retry queue " << *mpdu);
-  NS_ASSERT (mpdu->GetHeader ().IsQosData ());
-
-  uint8_t tid = mpdu->GetHeader ().GetQosTid ();
-  Mac48Address recipient = mpdu->GetHeader ().GetAddr1 ();
-
-  AgreementsI agreementIt = m_agreements.find (std::make_pair (recipient, tid));
-  NS_ASSERT (agreementIt != m_agreements.end ());
-
-  uint16_t mpduDist = agreementIt->second.first.GetDistance (mpdu->GetHeader ().GetSequenceNumber ());
-
-  if (mpduDist >= SEQNO_SPACE_HALF_SIZE)
-    {
-      NS_LOG_DEBUG ("Got an old packet. Do nothing");
-      return;
-    }
-
-  WifiMacQueue::ConstIterator it = m_retryPackets->PeekByTidAndAddress (tid, recipient);
-
-  while (it != m_retryPackets->end ())
-    {
-      if (mpdu->GetHeader ().GetSequenceControl () == (*it)->GetHeader ().GetSequenceControl ())
-        {
-          NS_LOG_DEBUG ("Packet already in the retransmit queue");
-          return;
-        }
-
-      uint16_t dist = agreementIt->second.first.GetDistance ((*it)->GetHeader ().GetSequenceNumber ());
-
-      if (mpduDist < dist ||
-          (mpduDist == dist && mpdu->GetHeader ().GetFragmentNumber () < (*it)->GetHeader ().GetFragmentNumber ()))
-        {
-          break;
-        }
-
-      it = m_retryPackets->PeekByTidAndAddress (tid, recipient, ++it);
-    }
-  mpdu->GetHeader ().SetRetry ();
-  m_retryPackets->Insert (it, mpdu);
+  m_droppedOldMpduCallback = callback;
 }
 
 uint16_t
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/block-ack-manager.h ns-3.35/src/wifi/model/block-ack-manager.h
--- ns-3.34/src/wifi/model/block-ack-manager.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/block-ack-manager.h	2021-10-01 13:26:48.000000000 -0700
@@ -32,7 +32,6 @@
 
 namespace ns3 {
 
-class WifiRemoteStationManager;
 class MgtAddBaResponseHeader;
 class MgtAddBaRequestHeader;
 class CtrlBAckResponseHeader;
@@ -79,6 +78,15 @@
    */
   BlockAckManager& operator= (const BlockAckManager& block);
 
+  /**
+   * Enumeration for the statuses of a buffered MPDU
+   */
+  enum MpduStatus : uint8_t
+  {
+    STAY_INFLIGHT = 0,
+    TO_RETRANSMIT,
+    ACKNOWLEDGED
+  };
 
 public:
   /**
@@ -91,12 +99,6 @@
   ~BlockAckManager ();
 
   /**
-   * Set up WifiRemoteStationManager associated with this BlockAckManager.
-   *
-   * \param manager WifiRemoteStationManager associated with this BlockAckManager
-   */
-  void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> manager);
-  /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
    *
@@ -121,11 +123,12 @@
   /**
    * \param reqHdr Relative Add block ack request (action frame).
    * \param recipient Address of peer station involved in block ack mechanism.
+   * \param htSupported Whether both originator and recipient support HT
    *
    * Creates a new block ack agreement in pending state. When a ADDBA response
    * with a successful status code is received, the relative agreement becomes established.
    */
-  void CreateAgreement (const MgtAddBaRequestHeader *reqHdr, Mac48Address recipient);
+  void CreateAgreement (const MgtAddBaRequestHeader *reqHdr, Mac48Address recipient, bool htSupported = true);
   /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid traffic ID of transmitted packet.
@@ -165,14 +168,6 @@
   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.
-   *
-   * \return true if there are packets that need of retransmission or at least a BAR is scheduled,
-   *         false otherwise
-   */
-  bool HasPackets (void);
-  /**
    * Invoked upon receipt of an Ack frame after the transmission of a QoS data frame
    * sent under an established block ack agreement. Remove the acknowledged frame
    * from the outstanding packets and update the starting sequence number of the
@@ -194,11 +189,10 @@
    * \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
+   * \return a pair of values indicating the number of successfully received MPDUs
+   *         and the number of failed MPDUs
    *
    * Invoked upon receipt of a BlockAck frame. Typically, this function, is called
    * by ns3::QosTxop object. Performs a check on which MPDUs, previously sent
@@ -207,9 +201,9 @@
    * 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,
-                          const std::set<uint8_t>& tids, double rxSnr, double dataSnr,
-                          const WifiTxVector& dataTxVector, size_t index = 0);
+  std::pair<uint16_t,uint16_t> NotifyGotBlockAck (const CtrlBAckResponseHeader& blockAck,
+                                                  Mac48Address recipient, const std::set<uint8_t>& tids,
+                                                  size_t index = 0);
   /**
    * \param recipient Sender of the expected BlockAck frame.
    * \param tid Traffic ID.
@@ -220,15 +214,6 @@
    */
   void NotifyMissedBlockAck (Mac48Address recipient, uint8_t tid);
   /**
-   * \param recipient outstanding frames' receiver.
-   * \param tid Traffic ID.
-   *
-   * Discard all the outstanding MPDUs destined to the given receiver and belonging
-   * to the given TID. Typically, this function is called by ns3::QosTxop object
-   * when it gives up retransmitting either a BlockAckRequest or the Data frames.
-   */
-  void DiscardOutstandingMpdus (Mac48Address recipient, uint8_t tid);
-  /**
    * \param recipient Address of peer station involved in block ack mechanism.
    * \param tid Traffic ID.
    *
@@ -279,12 +264,6 @@
    * and buffered packets) is greater of <i>nPackets</i>, they are transmitted using block ack mechanism.
    */
   void SetBlockAckThreshold (uint8_t nPackets);
-  /**
-   * \return the retransmit queue.
-   *
-   * Return the retransmit queue.
-   */
-  Ptr<WifiMacQueue> GetRetransmitQueue (void);
 
   /**
    * \param queue The WifiMacQueue object.
@@ -378,6 +357,11 @@
    */
   typedef Callback <void, Ptr<const WifiMacQueueItem>> TxFailed;
   /**
+   * typedef for a callback to invoke when an MPDU is dropped.
+   */
+  typedef Callback <void, Ptr<const WifiMacQueueItem>> DroppedOldMpdu;
+
+  /**
    * \param callback the callback to invoke when a
    * packet transmission was completed successfully.
    */
@@ -387,6 +371,10 @@
    * packet transmission was completed unsuccessfully.
    */
   void SetTxFailedCallback (TxFailed callback);
+  /**
+   * \param callback the callback to invoke when an old MPDU is dropped
+   */
+  void SetDroppedOldMpduCallback (DroppedOldMpdu callback);
 
   /**
    * TracedCallback signature for state changes.
@@ -431,6 +419,9 @@
    */
   void ScheduleBar (Ptr<const WifiMacQueueItem> bar, bool skipIfNoDataQueued = false);
 
+protected:
+  void DoDispose () override;
+
 private:
   /**
    * Inactivity timeout function
@@ -440,18 +431,6 @@
   void InactivityTimeout (Mac48Address recipient, uint8_t tid);
 
   /**
-   * Remove packets from the retransmit queue and from the queue of outstanding
-   * packets that become old after setting the starting sequence number for the
-   * agreement with recipient equal to <i>recipient</i> and TID equal to <i>tid</i>
-   * to the given <i>startingSeq</i>.
-   *
-   * \param recipient the recipient MAC address
-   * \param tid Traffic ID
-   * \param startingSeq the new starting sequence number
-   */
-  void RemoveOldPackets (Mac48Address recipient, uint8_t tid, uint16_t startingSeq);
-
-  /**
    * typedef for a list of WifiMacQueueItem.
    */
   typedef std::list<Ptr<WifiMacQueueItem>> PacketQueue;
@@ -480,33 +459,21 @@
                    std::pair<OriginatorBlockAckAgreement, PacketQueue> >::const_iterator AgreementsCI;
 
   /**
-   * \param mpdu the packet to insert in the retransmission queue
-   *
-   * Insert <i>mpdu</i> in retransmission queue.
-   * This method ensures packets are retransmitted in the correct order.
+   * Handle the given in flight MPDU based on its given status. If the status is
+   * ACKNOWLEDGED, the MPDU is removed from both the EDCA queue and the queue of
+   * in flight MPDUs. If the status is TO_RETRANSMIT, the MPDU is only removed
+   * from the queue of in flight MPDUs. Note that the MPDU is removed from both
+   * queues (independently of the status) if the MPDU is not stored in the EDCA
+   * queue, is an old packet or its lifetime expired.
+   *
+   * \param mpduIt an iterator pointing to the MPDU in the queue of in flight MPDUs
+   * \param status the status of the in flight MPDU
+   * \param it iterator pointing to the Block Ack agreement
+   * \param now the current time
+   * \return an iterator pointing to the next MPDU in the queue of in flight MPDUs
    */
-  void InsertInRetryQueue (Ptr<WifiMacQueueItem> mpdu);
-
-  /**
-   * Remove an item from retransmission queue.
-   * This method should be called when packets are acknowledged.
-   *
-   * \param address recipient MAC address of the packet to be removed
-   * \param tid Traffic ID of the packet to be removed
-   * \param seq sequence number of the packet to be removed
-   */
-  void RemoveFromRetryQueue (Mac48Address address, uint8_t tid, uint16_t seq);
-
-  /**
-   * Remove a range of items from retransmission queue.
-   * This method should be called when packets are acknowledged.
-   *
-   * \param address recipient MAC address of the packet to be removed
-   * \param tid Traffic ID of the packet to be removed
-   * \param startSeq sequence number of the first packet to be removed
-   * \param endSeq sequence number of the last packet to be removed
-   */
-  void RemoveFromRetryQueue (Mac48Address address, uint8_t tid, uint16_t startSeq, uint16_t endSeq);
+  PacketQueueI HandleInFlightMpdu (PacketQueueI mpduIt, MpduStatus status,
+                                    const AgreementsI& it, const Time& now);
 
   /**
    * This data structure contains, for each block ack agreement (recipient, TID), a set of packets
@@ -516,12 +483,6 @@
    */
   Agreements m_agreements;
 
-  /**
-   * This list contains all iterators to stored packets that need to be retransmitted.
-   * A packet needs retransmission if it's indicated as not correctly received in a BlockAck
-   * frame.
-   */
-  Ptr<WifiMacQueue> m_retryPackets;
   std::list<Bar> m_bars; ///< list of BARs
 
   uint8_t m_blockAckThreshold; ///< block ack threshold
@@ -531,7 +492,7 @@
   Callback<void, Mac48Address, uint8_t> m_unblockPackets; ///< unblock packets callback
   TxOk m_txOkCallback;                                    ///< transmit OK callback
   TxFailed m_txFailedCallback;                            ///< transmit failed callback
-  Ptr<WifiRemoteStationManager> m_stationManager;         ///< the station manager
+  DroppedOldMpdu m_droppedOldMpduCallback;                ///< the dropped MPDU callback
 
   /**
    * The trace source fired when a state transition occurred.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/channel-access-manager.cc ns-3.35/src/wifi/model/channel-access-manager.cc
--- ns-3.34/src/wifi/model/channel-access-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/channel-access-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -333,6 +333,7 @@
     {
       Ptr<Txop> txop = *i;
       if (txop->GetAccessStatus () == Txop::REQUESTED
+          && (!txop->IsQosTxop () || !StaticCast<QosTxop> (txop)->EdcaDisabled ())
           && GetBackoffEndFor (txop) <= Simulator::Now () )
         {
           /**
@@ -374,7 +375,7 @@
             {
               for (auto& collidingTxop : internalCollisionTxops)
                 {
-                  collidingTxop->NotifyInternalCollision ();
+                  m_feManager->NotifyInternalCollision (collidingTxop);
                 }
               break;
             }
@@ -404,17 +405,18 @@
 {
   NS_LOG_FUNCTION (this);
   Time lastRxEnd = m_lastRxStart + m_lastRxDuration;
-  Time rxAccessStart = lastRxEnd + GetSifs ();
+  const Time& sifs = GetSifs();
+  Time rxAccessStart = lastRxEnd + sifs;
   if ((lastRxEnd <= Simulator::Now ()) && !m_lastRxReceivedOk)
     {
       rxAccessStart += GetEifsNoDifs ();
     }
-  Time busyAccessStart = m_lastBusyStart + m_lastBusyDuration + GetSifs ();
-  Time txAccessStart = m_lastTxStart + m_lastTxDuration + GetSifs ();
-  Time navAccessStart = m_lastNavStart + m_lastNavDuration + GetSifs ();
-  Time ackTimeoutAccessStart = m_lastAckTimeoutEnd + GetSifs ();
-  Time ctsTimeoutAccessStart = m_lastCtsTimeoutEnd + GetSifs ();
-  Time switchingAccessStart = m_lastSwitchingStart + m_lastSwitchingDuration + GetSifs ();
+  Time busyAccessStart = m_lastBusyStart + m_lastBusyDuration + sifs;
+  Time txAccessStart = m_lastTxStart + m_lastTxDuration + sifs;
+  Time navAccessStart = m_lastNavStart + m_lastNavDuration + sifs;
+  Time ackTimeoutAccessStart = m_lastAckTimeoutEnd + sifs;
+  Time ctsTimeoutAccessStart = m_lastCtsTimeoutEnd + sifs;
+  Time switchingAccessStart = m_lastSwitchingStart + m_lastSwitchingDuration + sifs;
   Time accessGrantedStart;
   if (ignoreNav)
     {
@@ -542,6 +544,19 @@
 }
 
 void
+ChannelAccessManager::DisableEdcaFor (Ptr<Txop> qosTxop, Time duration)
+{
+  NS_LOG_FUNCTION (this << qosTxop << duration);
+  NS_ASSERT (qosTxop->IsQosTxop ());
+  UpdateBackoff ();
+  Time resume = Simulator::Now () + duration;
+  NS_LOG_DEBUG ("Backoff will resume at time " << resume << " with "
+                << qosTxop->GetBackoffSlots () << " remaining slot(s)");
+  qosTxop->UpdateBackoffSlotsNow (0, resume);
+  DoRestartAccessTimeoutIfNeeded ();
+}
+
+void
 ChannelAccessManager::NotifyRxStartNow (Time duration)
 {
   NS_LOG_FUNCTION (this << duration);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/channel-access-manager.h ns-3.35/src/wifi/model/channel-access-manager.h
--- ns-3.34/src/wifi/model/channel-access-manager.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/channel-access-manager.h	2021-10-01 13:26:48.000000000 -0700
@@ -115,6 +115,17 @@
   Time GetAccessGrantStart (bool ignoreNav = false) const;
 
   /**
+   * \param qosTxop a QosTxop that needs to be disabled
+   * \param duration the amount of time during which the QosTxop is disabled
+   *
+   * Disable the given EDCA for the given amount of time. This EDCA will not be
+   * granted channel access during this period and the backoff timer will be frozen.
+   * After this period, the EDCA will start normal operations again by resuming
+   * the backoff timer.
+   */
+  void DisableEdcaFor (Ptr<Txop> qosTxop, Time duration);
+
+  /**
    * \param duration expected duration of reception
    *
    * Notify the Txop that a packet reception started
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/frame-exchange-manager.cc ns-3.35/src/wifi/model/frame-exchange-manager.cc
--- ns-3.34/src/wifi/model/frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -281,7 +281,7 @@
     }
 
   m_dcf->NotifyChannelAccessed ();
-  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIteratorPairs ().front ().it;
+  Ptr<WifiMacQueueItem> mpdu = *queue->Peek ()->GetQueueIterator ();
   NS_ASSERT (mpdu != 0);
   NS_ASSERT (mpdu->GetHeader ().IsData () || mpdu->GetHeader ().IsMgt ());
 
@@ -327,15 +327,15 @@
     {
       NS_LOG_DEBUG ("Fragmenting the MSDU");
       m_fragmentedPacket = mpdu->GetPacket ()->Copy ();
+      AcIndex ac = mpdu->GetQueueAc ();
       // dequeue the MSDU
-      WifiMacQueueItem::QueueIteratorPair queueIt = mpdu->GetQueueIteratorPairs ().front ();
-      queueIt.queue->Dequeue (queueIt.it);
+      DequeueMpdu (mpdu);
       // 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);
+      m_mac->GetTxopQueue (ac)->PushFront (item);
       return item;
     }
   return mpdu;
@@ -395,6 +395,13 @@
   if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
     {
       Simulator::Schedule (txDuration, &FrameExchangeManager::TransmissionSucceeded, this);
+
+      if (!m_mpdu->GetHeader ().IsQosData ()
+          || m_mpdu->GetHeader ().GetQosAckPolicy () == WifiMacHeader::NO_ACK)
+        {
+          // No acknowledgment, hence dequeue the MPDU if it is stored in a queue
+          DequeueMpdu (m_mpdu);
+        }
     }
   else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NORMAL_ACK)
     {
@@ -436,22 +443,17 @@
 {
   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)
+FrameExchangeManager::DequeueMpdu (Ptr<const 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);
+      m_mac->GetTxopQueue (mpdu->GetQueueAc ())->DequeueIfQueued (mpdu);
     }
 }
 
@@ -775,6 +777,8 @@
     {
       NS_LOG_DEBUG ("Missed Ack, discard MPDU");
       NotifyPacketDiscarded (mpdu);
+      // Dequeue the MPDU if it is stored in a queue
+      DequeueMpdu (mpdu);
       m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (mpdu);
       m_dcf->ResetCw ();
     }
@@ -794,9 +798,6 @@
 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
@@ -841,6 +842,45 @@
 }
 
 void
+FrameExchangeManager::NotifyInternalCollision (Ptr<Txop> txop)
+{
+  NS_LOG_FUNCTION (this);
+
+  // 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<QosTxop> qosTxop = (txop->IsQosTxop () ? StaticCast<QosTxop> (txop) : nullptr);
+
+  Ptr<const WifiMacQueueItem> mpdu = (qosTxop != nullptr ? qosTxop->PeekNextMpdu ()
+                                                         : txop->GetWifiMacQueue ()->Peek ());
+
+  if (mpdu != nullptr)
+    {
+      m_mac->GetWifiRemoteStationManager ()->ReportDataFailed (mpdu);
+
+      if (!mpdu->GetHeader ().GetAddr1 ().IsGroup ()
+          && !m_mac->GetWifiRemoteStationManager ()->NeedRetransmission (mpdu))
+        {
+          NS_LOG_DEBUG ("reset DCF");
+          m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (mpdu);
+          DequeueMpdu (mpdu);
+          NotifyPacketDiscarded (mpdu);
+          txop->ResetCw ();
+        }
+      else
+        {
+          NS_LOG_DEBUG ("Update CW");
+          txop->UpdateFailedCw ();
+        }
+    }
+
+  txop->Txop::NotifyChannelReleased ();
+}
+
+void
 FrameExchangeManager::NotifySwitchingStartNow (Time duration)
 {
   NS_LOG_DEBUG ("Switching channel. Cancelling MAC pending events");
@@ -1102,6 +1142,9 @@
   // a frame containing all or part of an MSDU or MMPDU (sec. 10.3.3 of 802.11-2016)
   m_dcf->ResetCw ();
 
+  // The MPDU has been acknowledged, we can now dequeue it if it is stored in a queue
+  DequeueMpdu (mpdu);
+
   if (mpdu->GetHeader ().IsMoreFragments ())
     {
       // enqueue the next fragment
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/frame-exchange-manager.h ns-3.35/src/wifi/model/frame-exchange-manager.h
--- ns-3.34/src/wifi/model/frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
@@ -122,7 +122,7 @@
    */
   virtual void SetWifiPhy (const Ptr<WifiPhy> phy);
   /**
-   * Remove WifiPhy associated with this MacLow.
+   * Remove WifiPhy associated with this FrameExchangeManager.
    */
   virtual void ResetPhy (void);
   /**
@@ -213,23 +213,30 @@
   virtual void CalculateAcknowledgmentTime (WifiAcknowledgment* acknowledgment) const;
 
   /**
+   * Notify that an internal collision has occurred for the given Txop
+   *
+   * \param txop the Txop for which an internal collision has occurred
+   */
+  virtual void NotifyInternalCollision (Ptr<Txop> txop);
+
+  /**
    * \param duration switching delay duration.
    *
-   * This method is typically invoked by the PhyMacLowListener to notify
+   * This method is typically invoked by the PhyListener 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
+   * This method is typically invoked by the PhyListener 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
+   * This method is typically invoked by the PhyListener 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.
    */
@@ -396,7 +403,7 @@
    *
    * \param mpdu the given MPDU
    */
-  virtual void DequeueMpdu (Ptr<WifiMacQueueItem> mpdu);
+  virtual void DequeueMpdu (Ptr<const WifiMacQueueItem> mpdu);
 
   /**
    * Compute how to set the Duration/ID field of a frame being transmitted with
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/he-configuration.cc ns-3.35/src/wifi/model/he/he-configuration.cc
--- ns-3.34/src/wifi/model/he/he-configuration.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/he-configuration.cc	2021-10-01 13:26:48.000000000 -0700
@@ -58,6 +58,114 @@
                    MakeUintegerAccessor (&HeConfiguration::GetMpduBufferSize,
                                          &HeConfiguration::SetMpduBufferSize),
                    MakeUintegerChecker<uint16_t> (64, 256))
+    .AddAttribute ("MuBeAifsn",
+                   "AIFSN used by BE EDCA when the MU EDCA Timer is running. "
+                   "It must be either zero (EDCA disabled) or a value from 2 to 15.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&HeConfiguration::m_muBeAifsn),
+                   MakeUintegerChecker<uint8_t> (0, 15))
+    .AddAttribute ("MuBkAifsn",
+                   "AIFSN used by BK EDCA when the MU EDCA Timer is running. "
+                   "It must be either zero (EDCA disabled) or a value from 2 to 15.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&HeConfiguration::m_muBkAifsn),
+                   MakeUintegerChecker<uint8_t> (0, 15))
+    .AddAttribute ("MuViAifsn",
+                   "AIFSN used by VI EDCA when the MU EDCA Timer is running. "
+                   "It must be either zero (EDCA disabled) or a value from 2 to 15.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&HeConfiguration::m_muViAifsn),
+                   MakeUintegerChecker<uint8_t> (0, 15))
+    .AddAttribute ("MuVoAifsn",
+                   "AIFSN used by VO EDCA when the MU EDCA Timer is running. "
+                   "It must be either zero (EDCA disabled) or a value from 2 to 15.",
+                   UintegerValue (0),
+                   MakeUintegerAccessor (&HeConfiguration::m_muVoAifsn),
+                   MakeUintegerChecker<uint8_t> (0, 15))
+    .AddAttribute ("MuBeCwMin",
+                   "CWmin used by BE EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&HeConfiguration::m_muBeCwMin),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuBkCwMin",
+                   "CWmin used by BK EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&HeConfiguration::m_muBkCwMin),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuViCwMin",
+                   "CWmin used by VI EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&HeConfiguration::m_muViCwMin),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuVoCwMin",
+                   "CWmin used by VO EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (15),
+                   MakeUintegerAccessor (&HeConfiguration::m_muVoCwMin),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuBeCwMax",
+                   "CWmax used by BE EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (1023),
+                   MakeUintegerAccessor (&HeConfiguration::m_muBeCwMax),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuBkCwMax",
+                   "CWmax used by BK EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (1023),
+                   MakeUintegerAccessor (&HeConfiguration::m_muBkCwMax),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuViCwMax",
+                   "CWmax used by VI EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (1023),
+                   MakeUintegerAccessor (&HeConfiguration::m_muViCwMax),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("MuVoCwMax",
+                   "CWmax used by VO EDCA when the MU EDCA Timer is running. "
+                   "It must be a power of 2 minus 1 in the range from 0 to 32767.",
+                   UintegerValue (1023),
+                   MakeUintegerAccessor (&HeConfiguration::m_muVoCwMax),
+                   MakeUintegerChecker<uint16_t> (0, 32767))
+    .AddAttribute ("BeMuEdcaTimer",
+                   "The MU EDCA Timer used by BE EDCA. It must be a multiple of "
+                   "8192 us and must be in the range from 8.192 ms to 2088.96 ms. "
+                   "0 is a reserved value, but we allow to use this value to indicate "
+                   "that an MU EDCA Parameter Set element must not be sent. Therefore, "
+                   "0 can only be used if the MU EDCA Timer for all ACs is set to 0.",
+                   TimeValue (MicroSeconds (0)),
+                   MakeTimeAccessor (&HeConfiguration::m_beMuEdcaTimer),
+                   MakeTimeChecker (MicroSeconds (0), MicroSeconds (2088960)))
+    .AddAttribute ("BkMuEdcaTimer",
+                   "The MU EDCA Timer used by BK EDCA. It must be a multiple of "
+                   "8192 us and must be in the range from 8.192 ms to 2088.96 ms."
+                   "0 is a reserved value, but we allow to use this value to indicate "
+                   "that an MU EDCA Parameter Set element must not be sent. Therefore, "
+                   "0 can only be used if the MU EDCA Timer for all ACs is set to 0.",
+                   TimeValue (MicroSeconds (0)),
+                   MakeTimeAccessor (&HeConfiguration::m_bkMuEdcaTimer),
+                   MakeTimeChecker (MicroSeconds (0), MicroSeconds (2088960)))
+    .AddAttribute ("ViMuEdcaTimer",
+                   "The MU EDCA Timer used by VI EDCA. It must be a multiple of "
+                   "8192 us and must be in the range from 8.192 ms to 2088.96 ms."
+                   "0 is a reserved value, but we allow to use this value to indicate "
+                   "that an MU EDCA Parameter Set element must not be sent. Therefore, "
+                   "0 can only be used if the MU EDCA Timer for all ACs is set to 0.",
+                   TimeValue (MicroSeconds (0)),
+                   MakeTimeAccessor (&HeConfiguration::m_viMuEdcaTimer),
+                   MakeTimeChecker (MicroSeconds (0), MicroSeconds (2088960)))
+    .AddAttribute ("VoMuEdcaTimer",
+                   "The MU EDCA Timer used by VO EDCA. It must be a multiple of "
+                   "8192 us and must be in the range from 8.192 ms to 2088.96 ms."
+                   "0 is a reserved value, but we allow to use this value to indicate "
+                   "that an MU EDCA Parameter Set element must not be sent. Therefore, "
+                   "0 can only be used if the MU EDCA Timer for all ACs is set to 0.",
+                   TimeValue (MicroSeconds (0)),
+                   MakeTimeAccessor (&HeConfiguration::m_voMuEdcaTimer),
+                   MakeTimeChecker (MicroSeconds (0), MicroSeconds (2088960)))
     ;
     return tid;
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/he-configuration.h ns-3.35/src/wifi/model/he/he-configuration.h
--- ns-3.34/src/wifi/model/he/he-configuration.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/he-configuration.h	2021-10-01 13:26:48.000000000 -0700
@@ -74,6 +74,22 @@
   Time m_guardInterval;      //!< Supported HE guard interval
   uint8_t m_bssColor;        //!< BSS color
   uint16_t m_mpduBufferSize; //!< MPDU buffer size
+  uint8_t m_muBeAifsn;       //!< AIFSN for BE in MU EDCA Parameter Set
+  uint8_t m_muBkAifsn;       //!< AIFSN for BK in MU EDCA Parameter Set
+  uint8_t m_muViAifsn;       //!< AIFSN for VI in MU EDCA Parameter Set
+  uint8_t m_muVoAifsn;       //!< AIFSN for VO in MU EDCA Parameter Set
+  uint16_t m_muBeCwMin;      //!< CWmin for BE in MU EDCA Parameter Set
+  uint16_t m_muBkCwMin;      //!< CWmin for BK in MU EDCA Parameter Set
+  uint16_t m_muViCwMin;      //!< CWmin for VI in MU EDCA Parameter Set
+  uint16_t m_muVoCwMin;      //!< CWmin for VO in MU EDCA Parameter Set
+  uint16_t m_muBeCwMax;      //!< CWmax for BE in MU EDCA Parameter Set
+  uint16_t m_muBkCwMax;      //!< CWmax for BK in MU EDCA Parameter Set
+  uint16_t m_muViCwMax;      //!< CWmax for VI in MU EDCA Parameter Set
+  uint16_t m_muVoCwMax;      //!< CWmax for VO in MU EDCA Parameter Set
+  Time m_beMuEdcaTimer;      //!< Timer for BE in MU EDCA Parameter Set
+  Time m_bkMuEdcaTimer;      //!< Timer for BK in MU EDCA Parameter Set
+  Time m_viMuEdcaTimer;      //!< Timer for VI in MU EDCA Parameter Set
+  Time m_voMuEdcaTimer;      //!< Timer for VO in MU EDCA Parameter Set
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/he-frame-exchange-manager.cc ns-3.35/src/wifi/model/he/he-frame-exchange-manager.cc
--- ns-3.34/src/wifi/model/he/he-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/he-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -593,9 +593,6 @@
   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 ())
     {
@@ -1194,7 +1191,7 @@
       // otherwise, check if a suitable data frame is available
       if ((mpdu = edca->PeekNextMpdu (tid, hdr.GetAddr2 ())) != 0)
         {
-          WifiMacQueueItem::QueueIteratorPair queueIt;
+          WifiMacQueueItem::ConstIterator queueIt;
           Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, ppduDuration, false, queueIt);
 
           if (item != 0)
@@ -1428,8 +1425,10 @@
           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);
+          std::pair<uint16_t,uint16_t> ret = GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.GetAddr2 (),
+                                                                                    {tid});
+          m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (hdr.GetAddr2 (), ret.first, ret.second,
+                                                                      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)
@@ -1497,9 +1496,27 @@
                       tid = *tids.begin ();
                     }
 
-                  GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.GetAddr2 (), {tid},
-                                                         rxSignalInfo.snr, tag.Get (staId),
-                                                         m_txParams.m_txVector, index);
+                  std::pair<uint16_t,uint16_t> ret = GetBaManager (tid)->NotifyGotBlockAck (blockAck,
+                                                                                            hdr.GetAddr2 (),
+                                                                                            {tid}, index);
+                  m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (hdr.GetAddr2 (), ret.first,
+                                                                              ret.second, rxSignalInfo.snr,
+                                                                              tag.Get (staId),  m_txParams.m_txVector);
+                }
+
+              if (m_psduMap.at (staId)->GetHeader (0).IsQosData ()
+                  && (blockAck.GetAckType (index)  // Ack or All-ack context
+                      || std::any_of (blockAck.GetBitmap (index).begin (),
+                                      blockAck.GetBitmap (index).end (),
+                                      [](uint8_t b) { return b != 0; })))
+                {
+                  NS_ASSERT (m_psduMap.at (staId)->GetHeader (0).HasData ());
+                  NS_ASSERT (m_psduMap.at (staId)->GetHeader (0).GetQosTid () == tid);
+                  // the station has received a response from the AP for the HE TB PPDU
+                  // transmitted in response to a Basic Trigger Frame and at least one
+                  // MPDU was acknowledged. Therefore, it needs to update the access
+                  // parameters if it received an MU EDCA Parameter Set element.
+                  m_mac->GetQosTxop (tid)->StartMuEdcaTimerNow ();
                 }
             }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/he-phy.cc ns-3.35/src/wifi/model/he/he-phy.cc
--- ns-3.34/src/wifi/model/he/he-phy.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/he-phy.cc	2021-10-01 13:26:48.000000000 -0700
@@ -106,8 +106,9 @@
   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)
+        if (txVector.IsDlMu ())
           {
+            NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
             //Training comes after SIG-B
             return GetSigBMode (txVector);
           }
@@ -130,7 +131,7 @@
 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");
+  NS_ABORT_MSG_IF (!txVector.IsDlMu () || (txVector.GetModulationClass () != WIFI_MOD_CLASS_HE), "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
@@ -177,7 +178,16 @@
                             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);
+  Time stfDuration;
+  if (txVector.IsUlMu ())
+    {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
+      stfDuration = MicroSeconds (8);
+    }
+  else
+    {
+      stfDuration = 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
@@ -192,8 +202,9 @@
 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.
+  if (txVector.IsDlMu ()) //See section 27.3.10.8 of IEEE 802.11ax draft 4.0.
     {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
       /*
        * Compute the number of bits used by common field.
        * Assume that compression bit in HE-SIG-A is not set (i.e. not
@@ -262,7 +273,7 @@
 Time
 HePhy::ConvertLSigLengthToHeTbPpduDuration (uint16_t length, const WifiTxVector& txVector, WifiPhyBand band)
 {
-  NS_ABORT_IF (txVector.GetPreambleType () != WIFI_PREAMBLE_HE_TB);
+  NS_ABORT_IF (!txVector.IsUlMu () || (txVector.GetModulationClass () != WIFI_MOD_CLASS_HE));
   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;
@@ -281,7 +292,7 @@
 Time
 HePhy::CalculateNonOfdmaDurationForHeTb (const WifiTxVector& txVector) const
 {
-  NS_ABORT_IF (txVector.GetPreambleType () != WIFI_PREAMBLE_HE_TB);
+  NS_ABORT_IF (!txVector.IsUlMu () || (txVector.GetModulationClass () != WIFI_MOD_CLASS_HE));
   Time duration = GetDuration (WIFI_PPDU_FIELD_PREAMBLE, txVector)
     + GetDuration (WIFI_PPDU_FIELD_NON_HT_HEADER, txVector)
     + GetDuration (WIFI_PPDU_FIELD_SIG_A, txVector);
@@ -306,15 +317,22 @@
 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;
+  HePpdu::TxPsdFlag flag;
+  if (txVector.IsUlMu ())
+    {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
+      flag = HePpdu::PSD_HE_TB_NON_OFDMA_PORTION;
+    }
+  else
+    {
+      flag = 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,
+HePhy::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand& rxPowersW,
                              Time rxDuration)
 {
   NS_LOG_FUNCTION (this << ppdu << rxDuration);
@@ -322,9 +340,9 @@
   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 (txVector.IsUlMu () && psdFlag == HePpdu::PSD_HE_TB_OFDMA_PORTION)
     {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
       if (m_currentHeTbPpduUid == ppdu->GetUid ()
           && GetCurrentEvent () != 0)
         {
@@ -399,7 +417,7 @@
 }
 
 Ptr<Event>
-HePhy::DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW)
+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.
@@ -509,16 +527,17 @@
 {
   NS_LOG_FUNCTION (this << *event << status);
   //Notify end of SIG-A (in all cases)
+  WifiTxVector txVector = event->GetTxVector ();
   HeSigAParameters params;
   params.rssiW = GetRxPowerWForPpdu (event);
-  params.bssColor = event->GetTxVector ().GetBssColor ();
+  params.bssColor = txVector.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 ();
+      uint8_t rxBssColor = txVector.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.");
@@ -526,8 +545,9 @@
         }
 
       Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
-      if (event->GetTxVector ().GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+      if (txVector.IsUlMu ())
         {
+          NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
           m_currentHeTbPpduUid = ppdu->GetUid (); //to be able to correctly schedule start of OFDMA payload
         }
 
@@ -579,8 +599,9 @@
   uint16_t staId = GetStaId (ppdu);
   WifiMode txMode = txVector.GetMode (staId);
   uint8_t nss = txVector.GetNssMax ();
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+  if (txVector.IsDlMu ())
     {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
       for (auto info : txVector.GetHeMuUserInfoMap ())
         {
           if (info.first == staId)
@@ -610,8 +631,9 @@
   NS_LOG_FUNCTION (this << *event);
   const WifiTxVector& txVector = event->GetTxVector ();
   Ptr<const WifiPpdu> ppdu = event->GetPpdu ();
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+  if (txVector.IsUlMu ())
     {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
       Ptr<WifiNetDevice> device = DynamicCast<WifiNetDevice> (m_wifiPhy->GetDevice ());
       bool isAp = device != 0 && (DynamicCast<ApWifiMac> (device->GetMac ()) != 0);
       if (!isAp)
@@ -633,15 +655,12 @@
           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)
             {
-              //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 ());
-                }
+              NS_ASSERT (beginOfdmaPayloadRxEvent.second.IsRunning ());
             }
         }
     }
@@ -685,12 +704,18 @@
 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;
-                              });
+  const RxPowerWattPerChannelBand& rxPowersW = event->GetRxPowerWPerBand ();
+  //The total RX power corresponds to the maximum over all the bands.
+  //Only perform this computation if the result needs to be logged.
+  auto it = rxPowersW.end ();
+  if (g_log.IsEnabled (ns3::LOG_FUNCTION))
+    {
+      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));
@@ -761,7 +786,7 @@
 WifiSpectrumBand
 HePhy::GetNonOfdmaBand (const WifiTxVector& txVector, uint16_t staId) const
 {
-  NS_ASSERT (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB);
+  NS_ASSERT (txVector.IsUlMu () && (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE));
   uint16_t channelWidth = txVector.GetChannelWidth ();
   NS_ASSERT (channelWidth <= m_wifiPhy->GetChannelWidth ());
 
@@ -819,8 +844,9 @@
 {
   NS_LOG_FUNCTION (this << txVector);
   uint64_t uid;
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+  if (txVector.IsUlMu ())
     {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
       //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);
@@ -870,7 +896,7 @@
 HePhy::GetCenterFrequencyForNonOfdmaPart (const WifiTxVector& txVector, uint16_t staId) const
 {
   NS_LOG_FUNCTION (this << txVector << staId);
-  NS_ASSERT (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB);
+  NS_ASSERT (txVector.IsUlMu () && (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE));
   uint16_t centerFrequency = GetCenterFrequencyForChannelWidth (txVector);
   uint16_t currentWidth = txVector.GetChannelWidth ();
 
@@ -914,16 +940,18 @@
 Time
 HePhy::CalculateTxDuration (WifiConstPsduMap psduMap, const WifiTxVector& txVector, WifiPhyBand band) const
 {
-  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+  if (txVector.IsUlMu ())
     {
+      NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
       return ConvertLSigLengthToHeTbPpduDuration (txVector.GetLength (), txVector, band);
     }
 
   Time maxDuration = Seconds (0);
   for (auto & staIdPsdu : psduMap)
     {
-      if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+      if (txVector.IsDlMu ())
         {
+          NS_ASSERT (txVector.GetModulationClass () == WIFI_MOD_CLASS_HE);
           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");
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/he-phy.h ns-3.35/src/wifi/model/he/he-phy.h
--- ns-3.34/src/wifi/model/he/he-phy.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/he-phy.h	2021-10-01 13:26:48.000000000 -0700
@@ -94,7 +94,7 @@
                            Time ppduDuration) override;
   Ptr<const WifiPsdu> GetAddressedPsduInPpdu (Ptr<const WifiPpdu> ppdu) const override;
   void StartReceivePreamble (Ptr<WifiPpdu> ppdu,
-                             RxPowerWattPerChannelBand rxPowersW,
+                             RxPowerWattPerChannelBand& rxPowersW,
                              Time rxDuration) override;
   void CancelAllEvents (void) override;
   uint16_t GetStaId (const Ptr<const WifiPpdu> ppdu) const override;
@@ -370,7 +370,7 @@
 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;
+  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;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/he-ppdu.cc ns-3.35/src/wifi/model/he/he-ppdu.cc
--- ns-3.34/src/wifi/model/he/he-ppdu.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/he-ppdu.cc	2021-10-01 13:26:48.000000000 -0700
@@ -256,7 +256,7 @@
 {
   NS_LOG_FUNCTION (this << txCenterFreq << p20MinFreq << p20MaxFreq);
 
-  if (GetTxVector ().IsUlMu ())
+  if (IsUlMu ())
     {
       // APs are able to receive TB PPDUs sent on a band other than the primary20 channel
       return true;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/mu-edca-parameter-set.cc ns-3.35/src/wifi/model/he/mu-edca-parameter-set.cc
--- ns-3.34/src/wifi/model/he/mu-edca-parameter-set.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/wifi/model/he/mu-edca-parameter-set.cc	2021-10-01 13:26:48.000000000 -0700
@@ -0,0 +1,207 @@
+/* -*- 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-edca-parameter-set.h"
+#include <cmath>
+#include <algorithm>
+
+namespace ns3 {
+
+MuEdcaParameterSet::MuEdcaParameterSet ()
+  : m_qosInfo (0),
+    m_records {{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}, {0, 0, 0}}}
+{
+}
+
+WifiInformationElementId
+MuEdcaParameterSet::ElementId () const
+{
+  return IE_EXTENSION;
+}
+
+WifiInformationElementId
+MuEdcaParameterSet::ElementIdExt () const
+{
+  return IE_EXT_MU_EDCA_PARAMETER_SET;
+}
+
+bool
+MuEdcaParameterSet::IsPresent (void) const
+{
+  auto timerNotNull = [](const ParameterRecord &r) { return r.muEdcaTimer != 0; };
+
+  bool isPresent = std::all_of (m_records.begin (), m_records.end (), timerNotNull);
+  if (isPresent)
+    {
+      return true;
+    }
+  NS_ABORT_MSG_IF (std::any_of (m_records.begin (), m_records.end (), timerNotNull),
+                   "MU EDCA Timers must be either all zero or all non-zero.");
+  return false;
+}
+
+void
+MuEdcaParameterSet::SetQosInfo (uint8_t qosInfo)
+{
+  m_qosInfo = qosInfo;
+}
+
+void
+MuEdcaParameterSet::SetMuAifsn (uint8_t aci, uint8_t aifsn)
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  NS_ABORT_MSG_IF (aifsn == 1 || aifsn > 15, "Invalid AIFSN value: " << +aifsn);
+
+  m_records[aci].aifsnField |= (aifsn & 0x0f);
+  m_records[aci].aifsnField |= (aci & 0x03) << 5;
+}
+
+void
+MuEdcaParameterSet::SetMuCwMin (uint8_t aci, uint16_t cwMin)
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  NS_ABORT_MSG_IF (cwMin > 32767, "CWmin exceeds the maximum value");
+
+  auto eCwMin = std::log2 (cwMin + 1);
+  NS_ABORT_MSG_IF (std::trunc (eCwMin) != eCwMin, "CWmin is not a power of 2 minus 1");
+
+  m_records[aci].cwMinMax |= (static_cast<uint8_t> (eCwMin) & 0x0f);
+}
+
+void
+MuEdcaParameterSet::SetMuCwMax (uint8_t aci, uint16_t cwMax)
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  NS_ABORT_MSG_IF (cwMax > 32767, "CWmin exceeds the maximum value");
+
+  auto eCwMax = std::log2 (cwMax + 1);
+  NS_ABORT_MSG_IF (std::trunc (eCwMax) != eCwMax, "CWmax is not a power of 2 minus 1");
+
+  m_records[aci].cwMinMax |= (static_cast<uint8_t> (eCwMax) & 0x0f) << 4;
+}
+
+void
+MuEdcaParameterSet::SetMuEdcaTimer (uint8_t aci, Time timer)
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  NS_ABORT_MSG_IF (timer.IsStrictlyPositive () && timer < MicroSeconds (8192),
+                   "Timer value is below 8.192 ms");
+  NS_ABORT_MSG_IF (timer > MicroSeconds (2088960), "Timer value is above 2088.96 ms");
+
+  double value = timer.GetMicroSeconds () / 8192.;
+  NS_ABORT_MSG_IF (std::trunc (value) != value, "Timer value is not a multiple of 8 TUs (8192 us)");
+
+  m_records[aci].muEdcaTimer = static_cast<uint8_t> (value);
+}
+
+uint8_t
+MuEdcaParameterSet::GetQosInfo (void) const
+{
+  return m_qosInfo;
+}
+
+uint8_t
+MuEdcaParameterSet::GetMuAifsn (uint8_t aci) const
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  return (m_records[aci].aifsnField & 0x0f);
+}
+
+uint16_t
+MuEdcaParameterSet::GetMuCwMin (uint8_t aci) const
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  uint8_t eCwMin = (m_records[aci].cwMinMax & 0x0f);
+  return static_cast<uint16_t> (std::exp2 (eCwMin) - 1);
+}
+
+uint16_t
+MuEdcaParameterSet::GetMuCwMax (uint8_t aci) const
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  uint8_t eCwMax = ((m_records[aci].cwMinMax >> 4) & 0x0f);
+  return static_cast<uint16_t> (std::exp2 (eCwMax) - 1);
+}
+
+Time
+MuEdcaParameterSet::GetMuEdcaTimer (uint8_t aci) const
+{
+  NS_ABORT_MSG_IF (aci > 3, "Invalid AC Index value: " << +aci);
+  return MicroSeconds (m_records[aci].muEdcaTimer * 8192);
+}
+
+uint8_t
+MuEdcaParameterSet::GetInformationFieldSize () const
+{
+  NS_ASSERT (IsPresent ());
+  // ElementIdExt (1) + QoS Info (1) + MU Parameter Records (4 * 3)
+  return 14;
+}
+
+Buffer::Iterator
+MuEdcaParameterSet::Serialize (Buffer::Iterator i) const
+{
+  if (!IsPresent ())
+    {
+      return i;
+    }
+  return WifiInformationElement::Serialize (i);
+}
+
+uint16_t
+MuEdcaParameterSet::GetSerializedSize () const
+{
+  if (!IsPresent ())
+    {
+      return 0;
+    }
+  return WifiInformationElement::GetSerializedSize ();
+}
+
+void
+MuEdcaParameterSet::SerializeInformationField (Buffer::Iterator start) const
+{
+  if (IsPresent ())
+    {
+      start.WriteU8 (GetQosInfo ());
+      for (const auto& record : m_records)
+        {
+          start.WriteU8 (record.aifsnField);
+          start.WriteU8 (record.cwMinMax);
+          start.WriteU8 (record.muEdcaTimer);
+        }
+    }
+}
+
+uint8_t
+MuEdcaParameterSet::DeserializeInformationField (Buffer::Iterator start, uint8_t length)
+{
+  Buffer::Iterator i = start;
+  m_qosInfo = i.ReadU8 ();
+  for (auto& record : m_records)
+    {
+      record.aifsnField = i.ReadU8 ();
+      record.cwMinMax = i.ReadU8 ();
+      record.muEdcaTimer = i.ReadU8 ();
+    }
+  return 13;
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/mu-edca-parameter-set.h ns-3.35/src/wifi/model/he/mu-edca-parameter-set.h
--- ns-3.34/src/wifi/model/he/mu-edca-parameter-set.h	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/wifi/model/he/mu-edca-parameter-set.h	2021-10-01 13:26:48.000000000 -0700
@@ -0,0 +1,195 @@
+/* -*- 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_EDCA_PARAMETER_SET_H
+#define MU_EDCA_PARAMETER_SET_H
+
+#include "ns3/wifi-information-element.h"
+#include "ns3/nstime.h"
+#include <array>
+
+namespace ns3 {
+
+/**
+ * \brief The MU EDCA Parameter Set
+ * \ingroup wifi
+ *
+ * The 802.11ax MU EDCA Parameter Set.
+ */
+class MuEdcaParameterSet : public WifiInformationElement
+{
+public:
+  MuEdcaParameterSet ();
+  /**
+   * Return true if a valid MU EDCA Parameter Set is present in this object
+   * \return true if a valid MU EDCA Parameter Set is present in this object
+   */
+  bool IsPresent (void) const;
+
+  /**
+   * Set the QoS Info field in the MuEdcaParameterSet information element.
+   *
+   * \param qosInfo the QoS Info field in the MuEdcaParameterSet information element
+   */
+  void SetQosInfo (uint8_t qosInfo);
+  /**
+   * Set the AIFSN subfield of the ACI/AIFSN field in the MU AC Parameter Record
+   * field corresponding to the given AC Index (<i>aci</i>). Note that <i>aifsn</i>
+   * can either be zero (EDCA disabled) or in the range from 2 to 15.
+   *
+   * \param aci the AC Index
+   * \param aifsn the value for the AIFSN subfield
+   */
+  void SetMuAifsn (uint8_t aci, uint8_t aifsn);
+  /**
+   * Set the ECWmin subfield of the ECWmin/ECWmax field in the MU AC Parameter Record
+   * field corresponding to the given AC Index (<i>aci</i>). Note that <i>cwMin</i>
+   * must be a power of 2 minus 1 in the range from 0 to 32767.
+   *
+   * \param aci the AC Index
+   * \param cwMin the CWmin value encoded by the ECWmin field
+   */
+  void SetMuCwMin (uint8_t aci, uint16_t cwMin);
+  /**
+   * Set the ECWmax subfield of the ECWmin/ECWmax field in the MU AC Parameter Record
+   * field corresponding to the given AC Index (<i>aci</i>). Note that <i>cwMax</i>
+   * must be a power of 2 minus 1 in the range from 0 to 32767.
+   *
+   * \param aci the AC Index
+   * \param cwMax the CWmax value encoded by the ECWmax field
+   */
+  void SetMuCwMax (uint8_t aci, uint16_t cwMax);
+  /**
+   * Set the MU EDCA Timer field in the MU AC Parameter Record field corresponding
+   * to the given AC Index (<i>aci</i>). Note that <i>timer</i> must be an integer
+   * multiple of 8 TUs (i.e., 8 * 1024 = 8192 microseconds) in the range from
+   * 8.192 milliseconds to 2088.96 milliseconds. A value of 0 is used to indicate
+   * that the MU EDCA Parameter Set element must not be sent and therefore it is
+   * only allowed if the MU EDCA Timer is set to 0 for all ACs.
+   *
+   * \param aci the AC Index
+   * \param timer the value for the timer encoded by the MU EDCA Timer field
+   */
+  void SetMuEdcaTimer (uint8_t aci, Time timer);
+
+  /**
+   * Return the QoS Info field in the MuEdcaParameterSet information element.
+   *
+   * \return the QoS Info field in the MuEdcaParameterSet information element
+   */
+  uint8_t GetQosInfo (void) const;
+  /**
+   * Get the AIFSN subfield of the ACI/AIFSN field in the MU AC Parameter Record
+   * field corresponding to the given AC Index (<i>aci</i>).
+   *
+   * \param aci the AC Index
+   * \return the value of the AIFSN subfield
+   */
+  uint8_t GetMuAifsn (uint8_t aci) const;
+  /**
+   * Get the CWmin value encoded by the ECWmin subfield of the ECWmin/ECWmax field
+   * in the MU AC Parameter Record field corresponding to the given AC Index (<i>aci</i>).
+   *
+   * \param aci the AC Index
+   * \return the CWmin value
+   */
+  uint16_t GetMuCwMin (uint8_t aci) const;
+  /**
+   * Get the CWmax value encoded by the ECWmax subfield of the ECWmin/ECWmax field
+   * in the MU AC Parameter Record field corresponding to the given AC Index (<i>aci</i>).
+   *
+   * \param aci the AC Index
+   * \return the CWmax value
+   */
+  uint16_t GetMuCwMax (uint8_t aci) const;
+  /**
+   * Get the MU EDCA Timer value encoded in the MU AC Parameter Record field corresponding
+   * to the given AC Index (<i>aci</i>).
+   *
+   * \param aci the AC Index
+   * \return the MU EDCA Timer value
+   */
+  Time GetMuEdcaTimer (uint8_t aci) const;
+
+  /**
+   * Get the wifi information element ID
+   * \return the wifi information element ID
+   */
+  WifiInformationElementId ElementId () const;
+  /**
+   * Get the wifi information element ID extension
+   * \return the wifi information element ID extension
+   */
+  WifiInformationElementId ElementIdExt () const;
+  /**
+   * Get information field size function
+   * \return the information field size
+   */
+  uint8_t GetInformationFieldSize () const;
+  /**
+   * Serialize information field function
+   * \param start the iterator
+   */
+  void SerializeInformationField (Buffer::Iterator start) const;
+  /**
+   * Deserialize information field function
+   * \param start the iterator
+   * \param length the length
+   * \return the size
+   */
+  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.
+   *
+   * \param start iterator start
+   *
+   * \return an iterator
+   */
+  Buffer::Iterator Serialize (Buffer::Iterator start) const;
+  /**
+   * Return the serialized size of this EDCA Parameter Set.
+   *
+   * \return the serialized size of this EDCA Parameter Set
+   */
+  uint16_t GetSerializedSize () const;
+
+
+private:
+  /**
+   * MU AC Parameter Record type
+   */
+  struct ParameterRecord
+    {
+      uint8_t aifsnField;                    ///< the ACI/AIFSN field
+      uint8_t cwMinMax;                      ///< the ECWmin/ECWmax field
+      uint8_t muEdcaTimer;                   ///< the MU EDCA Timer field
+    };
+
+  uint8_t m_qosInfo;                         ///< QoS info field
+  std::array<ParameterRecord, 4> m_records;  ///< MU AC Parameter Record fields
+};
+
+} //namespace ns3
+
+#endif /* MU_EDCA_PARAMETER_SET_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/he/rr-multi-user-scheduler.cc ns-3.35/src/wifi/model/he/rr-multi-user-scheduler.cc
--- ns-3.34/src/wifi/model/he/rr-multi-user-scheduler.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/he/rr-multi-user-scheduler.cc	2021-10-01 13:26:48.000000000 -0700
@@ -137,6 +137,13 @@
 {
   NS_LOG_FUNCTION (this);
 
+  Ptr<const WifiMacQueueItem> mpdu = m_edca->PeekNextMpdu ();
+
+  if (mpdu != 0 && !GetWifiRemoteStationManager ()->GetHeSupported (mpdu->GetHeader ().GetAddr1 ()))
+    {
+      return SU_TX;
+    }
+
   if (m_enableUlOfdma && m_enableBsrp && GetLastTxFormat () == DL_MU_TX)
     {
       return TrySendingBsrpTf ();
@@ -721,10 +728,9 @@
       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++;
+      WifiMacQueueItem::ConstIterator queueIt = mpdu->GetQueueIterator ();
+      Ptr<WifiMacQueueItem> item = *queueIt;
+      queueIt++;
 
       if (!mpdu->GetHeader ().IsRetry ())
         {
@@ -735,7 +741,7 @@
           if (item == nullptr)
             {
               // A-MSDU aggregation failed or disabled
-              item = *mpdu->GetQueueIteratorPairs ().front ().it;
+              item = *mpdu->GetQueueIterator ();
             }
           m_apMac->GetQosTxop (QosUtilsMapTidToAc (tid))->AssignSequenceNumber (item);
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.cc ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.cc
--- ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -27,6 +27,8 @@
 #include "ns3/wifi-utils.h"
 #include "ns3/snr-tag.h"
 #include "ns3/ctrl-headers.h"
+#include <array>
+#include <optional>
 
 #undef NS_LOG_APPEND_CONTEXT
 #define NS_LOG_APPEND_CONTEXT std::clog << "[mac=" << m_self << "] "
@@ -182,6 +184,8 @@
   txParams.m_protection = std::unique_ptr<WifiProtection> (new WifiNoProtection);
   txParams.m_acknowledgment = GetAckManager ()->TryAddMpdu (mpdu, txParams);
 
+  // Push the MPDU to the front of the queue and transmit it
+  m_mac->GetQosTxop (tid)->GetWifiMacQueue ()->PushFront (mpdu);
   SendMpduWithProtection (mpdu, txParams);
 }
 
@@ -443,7 +447,7 @@
   Ptr<QosTxop> edca = m_mac->GetQosTxop (peekedItem->GetHeader ().GetQosTid ());
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peekedItem->GetHeader ());
-  WifiMacQueueItem::QueueIteratorPair queueIt;
+  WifiMacQueueItem::ConstIterator queueIt;
   Ptr<WifiMacQueueItem> mpdu = edca->GetNextMpdu (peekedItem, txParams, availableTime, initialFrame, queueIt);
 
   if (mpdu == nullptr)
@@ -801,6 +805,15 @@
   if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::NONE)
     {
       Simulator::Schedule (txDuration, &HtFrameExchangeManager::TransmissionSucceeded, this);
+
+      std::set<uint8_t> tids = m_psdu->GetTids ();
+      NS_ASSERT_MSG (tids.size () <= 1, "Multi-TID A-MPDUs are not supported");
+
+      if (tids.size () == 0 || m_psdu->GetAckPolicyForTid (*tids.begin ()) == WifiMacHeader::NO_ACK)
+        {
+          // No acknowledgment, hence dequeue the PSDU if it is stored in a queue
+          DequeuePsdu (m_psdu);
+        }
     }
   else if (m_txParams.m_acknowledgment->method == WifiAcknowledgment::BLOCK_ACK)
     {
@@ -862,17 +875,32 @@
 {
   NS_LOG_FUNCTION (this << psdu);
 
+  // use an array to avoid computing the queue size for every MPDU in the PSDU
+  std::array<std::optional<uint8_t>, 8> queueSizeForTid;
+
   for (const auto& mpdu : *PeekPointer (psdu))
     {
-      if (mpdu->GetHeader ().IsQosData ())
+      WifiMacHeader& hdr = mpdu->GetHeader ();
+
+      if (hdr.IsQosData ())
         {
-          Ptr<QosTxop> edca = m_mac->GetQosTxop (mpdu->GetHeader ().GetQosTid ());
+          uint8_t tid = hdr.GetQosTid ();
+          Ptr<QosTxop> edca = m_mac->GetQosTxop (tid);
 
-          if (mpdu->GetHeader ().IsQosEosp ())
+          if (m_mac->GetTypeOfStation () == STA
+              && (m_setQosQueueSize || hdr.IsQosEosp ()))
             {
-              edca->SetQosQueueSize (mpdu);
+              // set the Queue Size subfield of the QoS Control field
+              if (!queueSizeForTid[tid].has_value ())
+                {
+                  queueSizeForTid[tid] = edca->GetQosQueueSize (tid, hdr.GetAddr1 ());
+                }
+
+              hdr.SetQosEosp ();
+              hdr.SetQosQueueSize (queueSizeForTid[tid].value ());
             }
-          if (mpdu->GetHeader ().HasData ())
+
+          if (hdr.HasData ())
             {
               edca->CompleteMpduTx (mpdu);
             }
@@ -881,33 +909,13 @@
 }
 
 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);
-        }
+      DequeueMpdu (mpdu);
     }
 }
 
@@ -924,9 +932,6 @@
       txVector.SetAggregation (true);
     }
 
-  // The PSDU is about to be transmitted, we can now dequeue the MPDUs
-  DequeuePsdu (psdu);
-
   m_phy->Send (psdu, txVector);
 }
 
@@ -1197,21 +1202,9 @@
           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);
-                }
+              // schedule a BlockAckRequest with skipIfNoDataQueued set to true, so that the
+              // BlockAckRequest is only sent if there are data frames queued for this recipient.
+              edca->ScheduleBar (edca->PrepareBlockAckRequest (recipient, tid), true);
             }
           resetCw = true;
         }
@@ -1225,9 +1218,9 @@
           m_mac->GetWifiRemoteStationManager ()->ReportFinalDataFailed (*psdu->begin ());
           for (const auto& mpdu : *PeekPointer (psdu))
             {
-              FrameExchangeManager::NotifyPacketDiscarded (mpdu);
+              NotifyPacketDiscarded (mpdu);
+              DequeueMpdu (mpdu);
             }
-          GetBaManager (tid)->DiscardOutstandingMpdus (recipient, tid);
           resetCw = true;
         }
       else
@@ -1343,8 +1336,9 @@
           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);
+          std::pair<uint16_t,uint16_t> ret = GetBaManager (tid)->NotifyGotBlockAck (blockAck, hdr.GetAddr2 (), {tid});
+          m_mac->GetWifiRemoteStationManager ()->ReportAmpduTxStatus (hdr.GetAddr2 (), ret.first, ret.second,
+                                                                      rxSnr, tag.Get (),  m_txParams.m_txVector);
 
           // cancel the timer
           m_txTimer.Cancel ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.h ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.h
--- ns-3.34/src/wifi/model/ht/ht-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/ht/ht-frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
@@ -148,9 +148,9 @@
    * 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.
+   * Response frame. At this point the frame exchange manager 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);
@@ -212,7 +212,6 @@
   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
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/ht/ht-phy.cc ns-3.35/src/wifi/model/ht/ht-phy.cc
--- ns-3.34/src/wifi/model/ht/ht-phy.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/ht/ht-phy.cc	2021-10-01 13:26:48.000000000 -0700
@@ -382,7 +382,7 @@
 HtPhy::EndReceiveHtSig (Ptr<Event> event)
 {
   NS_LOG_FUNCTION (this << *event);
-  NS_ASSERT (IsHt (event->GetTxVector ().GetPreambleType ()));
+  NS_ASSERT (event->GetTxVector ().GetPreambleType () == WIFI_PREAMBLE_HT_MF);
   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);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/interference-helper.cc ns-3.35/src/wifi/model/interference-helper.cc
--- ns-3.34/src/wifi/model/interference-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/interference-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -38,12 +38,12 @@
  *       PHY event class
  ****************************************************************/
 
-Event::Event (Ptr<const WifiPpdu> ppdu, const 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 ()),
     m_endTime (m_startTime + duration),
-    m_rxPowerW (rxPower)
+    m_rxPowerW (std::move (rxPower))
 {
 }
 
@@ -97,7 +97,7 @@
   return it->second;
 }
 
-RxPowerWattPerChannelBand
+const RxPowerWattPerChannelBand&
 Event::GetRxPowerWPerBand (void) const
 {
   return m_rxPowerW;
@@ -110,7 +110,7 @@
 }
 
 void
-Event::UpdateRxPowerW (RxPowerWattPerChannelBand rxPower)
+Event::UpdateRxPowerW (const RxPowerWattPerChannelBand& rxPower)
 {
   NS_ASSERT (rxPower.size () == m_rxPowerW.size ());
   //Update power band per band
@@ -187,15 +187,15 @@
 }
 
 Ptr<Event>
-InterferenceHelper::Add (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPowerW, bool isStartOfdmaRxing)
+InterferenceHelper::Add (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand& rxPowerW, bool isStartOfdmaRxing)
 {
-  Ptr<Event> event = Create<Event> (ppdu, txVector, duration, rxPowerW);
+  Ptr<Event> event = Create<Event> (ppdu, txVector, duration, std::move (rxPowerW));
   AppendEvent (event, isStartOfdmaRxing);
   return event;
 }
 
 void
-InterferenceHelper::AddForeignSignal (Time duration, RxPowerWattPerChannelBand rxPowerW)
+InterferenceHelper::AddForeignSignal (Time duration, RxPowerWattPerChannelBand& rxPowerW)
 {
   // Parameters other than duration and rxPowerW are unused for this type
   // of signal, so we provide dummy versions
@@ -225,9 +225,10 @@
   NS_LOG_FUNCTION (this << band.first << band.second);
   NS_ASSERT (m_niChangesPerBand.find (band) == m_niChangesPerBand.end ());
   NiChanges niChanges;
-  m_niChangesPerBand.insert ({band, niChanges});
+  auto result = m_niChangesPerBand.insert ({band, niChanges});
+  NS_ASSERT (result.second);
   // Always have a zero power noise event in the list
-  AddNiChangeEvent (Time (0), NiChange (0.0, 0), band);
+  AddNiChangeEvent (Time (0), NiChange (0.0, 0), result.first);
   m_firstPowerPerBand.insert ({band, 0.0});
 }
 
@@ -259,11 +260,11 @@
 InterferenceHelper::GetEnergyDuration (double energyW, WifiSpectrumBand band)
 {
   Time now = Simulator::Now ();
-  auto i = GetPreviousPosition (now, band);
+  auto niIt = m_niChangesPerBand.find (band);
+  NS_ASSERT (niIt != m_niChangesPerBand.end ());
+  auto i = GetPreviousPosition (now, niIt);
   Time end = i->first;
-  auto ni_it = m_niChangesPerBand.find (band);
-  NS_ASSERT (ni_it != m_niChangesPerBand.end ());
-  for (; i != ni_it->second.end (); ++i)
+  for (; i != niIt->second.end (); ++i)
     {
       double noiseInterferenceW = i->second.GetPower ();
       end = i->first;
@@ -279,21 +280,21 @@
 InterferenceHelper::AppendEvent (Ptr<Event> event, bool isStartOfdmaRxing)
 {
   NS_LOG_FUNCTION (this << event << isStartOfdmaRxing);
-  RxPowerWattPerChannelBand rxPowerWattPerChannelBand = event->GetRxPowerWPerBand ();
-  for (auto const& it : rxPowerWattPerChannelBand)
+  for (auto const& it : event->GetRxPowerWPerBand ())
     {
       WifiSpectrumBand band = it.first;
-      auto ni_it = m_niChangesPerBand.find (band);
-      NS_ASSERT (ni_it != m_niChangesPerBand.end ());
+      auto niIt = m_niChangesPerBand.find (band);
+      NS_ASSERT (niIt != m_niChangesPerBand.end ());
       double previousPowerStart = 0;
       double previousPowerEnd = 0;
-      previousPowerStart = GetPreviousPosition (event->GetStartTime (), band)->second.GetPower ();
-      previousPowerEnd = GetPreviousPosition (event->GetEndTime (), band)->second.GetPower ();
+      auto previousPowerPosition = GetPreviousPosition (event->GetStartTime (), niIt);
+      previousPowerStart = previousPowerPosition->second.GetPower ();
+      previousPowerEnd = GetPreviousPosition (event->GetEndTime (), niIt)->second.GetPower ();
       if (!m_rxing)
         {
           m_firstPowerPerBand.find (band)->second = previousPowerStart;
           // Always leave the first zero power noise event in the list
-          ni_it->second.erase (++(ni_it->second.begin ()), GetNextPosition (event->GetStartTime (), band));
+          niIt->second.erase (++(niIt->second.begin ()), ++previousPowerPosition);
         }
       else if (isStartOfdmaRxing)
         {
@@ -302,8 +303,8 @@
           //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);
+      auto first = AddNiChangeEvent (event->GetStartTime (), NiChange (previousPowerStart, event), niIt);
+      auto last = AddNiChangeEvent (event->GetEndTime (), NiChange (previousPowerEnd, event), niIt);
       for (auto i = first; i != last; ++i)
         {
           i->second.AddPower (it.second);
@@ -312,17 +313,17 @@
 }
 
 void
-InterferenceHelper::UpdateEvent (Ptr<Event> event, RxPowerWattPerChannelBand rxPower)
+InterferenceHelper::UpdateEvent (Ptr<Event> event, const 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);
+      auto niIt = m_niChangesPerBand.find (band);
+      NS_ASSERT (niIt != m_niChangesPerBand.end ());
+      auto first = GetPreviousPosition (event->GetStartTime (), niIt);
+      auto last = GetPreviousPosition (event->GetEndTime (), niIt);
       for (auto i = first; i != last; ++i)
         {
           i->second.AddPower (it.second);
@@ -364,19 +365,19 @@
   auto firstPower_it = m_firstPowerPerBand.find (band);
   NS_ASSERT (firstPower_it != m_firstPowerPerBand.end ());
   double noiseInterferenceW = firstPower_it->second;
-  auto ni_it = m_niChangesPerBand.find (band);
-  NS_ASSERT (ni_it != m_niChangesPerBand.end ());
-  auto it = ni_it->second.find (event->GetStartTime ());
-  for (; it != ni_it->second.end () && it->first < Simulator::Now (); ++it)
+  auto niIt = m_niChangesPerBand.find (band);
+  NS_ASSERT (niIt != m_niChangesPerBand.end ());
+  auto it = niIt->second.find (event->GetStartTime ());
+  for (; it != niIt->second.end () && it->first < Simulator::Now (); ++it)
     {
       noiseInterferenceW = it->second.GetPower () - event->GetRxPowerW (band);
     }
-  it = ni_it->second.find (event->GetStartTime ());
-  NS_ASSERT (it != ni_it->second.end ());
-  for (; it != ni_it->second.end () && it->second.GetEvent () != event; ++it);
+  it = niIt->second.find (event->GetStartTime ());
+  NS_ASSERT (it != niIt->second.end ());
+  for (; it != niIt->second.end () && it->second.GetEvent () != event; ++it);
   NiChanges ni;
   ni.emplace (event->GetStartTime (), NiChange (0, event));
-  while (++it != ni_it->second.end () && it->second.GetEvent () != event)
+  while (++it != niIt->second.end () && it->second.GetEvent () != event)
     {
       ni.insert (*it);
     }
@@ -421,8 +422,8 @@
 {
   NS_LOG_FUNCTION (this << channelWidth << band.first << band.second << staId << window.first << window.second);
   double psr = 1.0; /* Packet Success Rate */
-  auto ni_it = nis->find (band)->second;
-  auto j = ni_it.begin ();
+  auto niIt = nis->find (band)->second;
+  auto j = niIt.begin ();
   Time previous = j->first;
   WifiMode payloadMode = event->GetTxVector ().GetMode (staId);
   Time phyPayloadStart = j->first;
@@ -434,7 +435,7 @@
   Time windowEnd = phyPayloadStart + window.second;
   double noiseInterferenceW = m_firstPowerPerBand.find (band)->second;
   double powerW = event->GetRxPowerW (band);
-  while (++j != ni_it.end ())
+  while (++j != niIt.end ())
     {
       Time current = j->first;
       NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
@@ -471,8 +472,8 @@
 {
   NS_LOG_FUNCTION (this << band.first << band.second);
   double psr = 1.0; /* Packet Success Rate */
-  auto ni_it = nis->find (band)->second;
-  auto j = ni_it.begin ();
+  auto niIt = nis->find (band)->second;
+  auto j = niIt.begin ();
 
   NS_ASSERT (!phyHeaderSections.empty ());
   Time stopLastSection = Seconds (0);
@@ -484,7 +485,7 @@
   Time previous = j->first;
   double noiseInterferenceW = m_firstPowerPerBand.find (band)->second;
   double powerW = event->GetRxPowerW (band);
-  while (++j != ni_it.end ())
+  while (++j != niIt.end ())
     {
       Time current = j->first;
       NS_LOG_DEBUG ("previous= " << previous << ", current=" << current);
@@ -523,11 +524,11 @@
                                            WifiPpduField header) const
 {
   NS_LOG_FUNCTION (this << band.first << band.second << header);
-  auto ni_it = nis->find (band)->second;
+  auto niIt = nis->find (band)->second;
   auto phyEntity = WifiPhy::GetStaticPhyEntity (event->GetTxVector ().GetModulationClass ());
 
   PhyEntity::PhyHeaderSections sections;
-  for (const auto & section : phyEntity->GetPhyHeaderSections (event->GetTxVector (), ni_it.begin ()->first))
+  for (const auto & section : phyEntity->GetPhyHeaderSections (event->GetTxVector (), niIt.begin ()->first))
     {
       if (section.first == header)
         {
@@ -598,28 +599,26 @@
 void
 InterferenceHelper::EraseEvents (void)
 {
-  for (auto it : m_niChangesPerBand)
+  for (auto niIt = m_niChangesPerBand.begin(); niIt != m_niChangesPerBand.end(); ++niIt)
     {
-      it.second.clear ();
+      niIt->second.clear ();
       // Always have a zero power noise event in the list
-      AddNiChangeEvent (Time (0), NiChange (0.0, 0), it.first);
-      m_firstPowerPerBand.at (it.first) = 0.0;
+      AddNiChangeEvent (Time (0), NiChange (0.0, 0), niIt);
+      m_firstPowerPerBand.at (niIt->first) = 0.0;
     }
   m_rxing = false;
 }
 
 InterferenceHelper::NiChanges::iterator
-InterferenceHelper::GetNextPosition (Time moment, WifiSpectrumBand band)
+InterferenceHelper::GetNextPosition (Time moment, NiChangesPerBand::iterator niIt)
 {
-  auto it = m_niChangesPerBand.find (band);
-  NS_ASSERT (it != m_niChangesPerBand.end ());
-  return it->second.upper_bound (moment);
+  return niIt->second.upper_bound (moment);
 }
 
 InterferenceHelper::NiChanges::iterator
-InterferenceHelper::GetPreviousPosition (Time moment, WifiSpectrumBand band)
+InterferenceHelper::GetPreviousPosition (Time moment, NiChangesPerBand::iterator niIt)
 {
-  auto it = GetNextPosition (moment, band);
+  auto it = GetNextPosition (moment, niIt);
   // This is safe since there is always an NiChange at time 0,
   // before moment.
   --it;
@@ -627,11 +626,9 @@
 }
 
 InterferenceHelper::NiChanges::iterator
-InterferenceHelper::AddNiChangeEvent (Time moment, NiChange change, WifiSpectrumBand band)
+InterferenceHelper::AddNiChangeEvent (Time moment, NiChange change, NiChangesPerBand::iterator niIt)
 {
-  auto it = m_niChangesPerBand.find (band);
-  NS_ASSERT (it != m_niChangesPerBand.end ());
-  return it->second.insert (GetNextPosition (moment, band), std::make_pair (moment, change));
+  return niIt->second.insert (GetNextPosition (moment, niIt), std::make_pair (moment, change));
 }
 
 void
@@ -647,12 +644,12 @@
   NS_LOG_FUNCTION (this << endTime);
   m_rxing = false;
   //Update m_firstPowerPerBand for frame capture
-  for (auto ni : m_niChangesPerBand)
+  for (auto niIt = m_niChangesPerBand.begin(); niIt != m_niChangesPerBand.end(); ++niIt)
     {
-      NS_ASSERT (ni.second.size () > 1);
-      auto it = GetPreviousPosition (endTime, ni.first);
+      NS_ASSERT (niIt->second.size () > 1);
+      auto it = GetPreviousPosition (endTime, niIt);
       it--;
-      m_firstPowerPerBand.find (ni.first)->second = it->second.GetPower ();
+      m_firstPowerPerBand.find (niIt->first)->second = it->second.GetPower ();
     }
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/interference-helper.h ns-3.35/src/wifi/model/interference-helper.h
--- ns-3.34/src/wifi/model/interference-helper.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/interference-helper.h	2021-10-01 13:26:48.000000000 -0700
@@ -38,14 +38,15 @@
 {
 public:
   /**
-   * Create an Event with the given parameters.
+   * Create an Event with the given parameters. Note that <i>rxPower</i> will
+   * be moved into this object.
    *
    * \param ppdu the PPDU
    * \param txVector the TXVECTOR
    * \param duration duration of the PPDU
    * \param rxPower the received power per band (W)
    */
-  Event (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower);
+  Event (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration,  RxPowerWattPerChannelBand&& rxPower);
   ~Event ();
 
   /**
@@ -90,7 +91,7 @@
    *
    * \return the received power (W) for all bands.
    */
-  RxPowerWattPerChannelBand GetRxPowerWPerBand (void) const;
+  const RxPowerWattPerChannelBand& GetRxPowerWPerBand (void) const;
   /**
    * Return the TXVECTOR of the PPDU.
    *
@@ -103,7 +104,7 @@
    *
    * \param rxPower the received power (W) for all bands.
    */
-  void UpdateRxPowerW (RxPowerWattPerChannelBand rxPower);
+  void UpdateRxPowerW (const RxPowerWattPerChannelBand& rxPower);
 
 
 private:
@@ -194,14 +195,14 @@
    *
    * \return Event
    */
-  Ptr<Event> Add (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing = false);
+  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.
    * \param duration the duration of the signal
    * \param rxPower received power per band (W)
    */
-  void AddForeignSignal (Time duration, RxPowerWattPerChannelBand rxPower);
+  void AddForeignSignal (Time duration, RxPowerWattPerChannelBand& rxPower);
   /**
    * Calculate the SNIR at the start of the payload and accumulate
    * all SNIR changes in the SNIR vector for each MPDU of an A-MPDU.
@@ -265,7 +266,7 @@
    * \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);
+  void UpdateEvent (Ptr<Event> event, const RxPowerWattPerChannelBand& rxPower);
 
 
 protected:
@@ -431,18 +432,18 @@
    * Returns an iterator to the first NiChange that is later than moment
    *
    * \param moment time to check from
-   * \param band identify the band to check
+   * \param niIt iterator of the band to check
    * \returns an iterator to the list of NiChanges
    */
-  NiChanges::iterator GetNextPosition (Time moment, WifiSpectrumBand band);
+  NiChanges::iterator GetNextPosition (Time moment, NiChangesPerBand::iterator niIt);
   /**
    * Returns an iterator to the last NiChange that is before than moment
    *
    * \param moment time to check from
-   * \param band identify the band to check
+   * \param niIt iterator of the band to check
    * \returns an iterator to the list of NiChanges
    */
-  NiChanges::iterator GetPreviousPosition (Time moment, WifiSpectrumBand band);
+  NiChanges::iterator GetPreviousPosition (Time moment, NiChangesPerBand::iterator niIt);
 
   /**
    * Add NiChange to the list at the appropriate position and
@@ -450,10 +451,10 @@
    *
    * \param moment time to check from
    * \param change the NiChange to add
-   * \param band identify the band to check
+   * \param niIt iterator of the band to check
    * \returns the iterator of the new event
    */
-  NiChanges::iterator AddNiChangeEvent (Time moment, NiChange change, WifiSpectrumBand band);
+  NiChanges::iterator AddNiChangeEvent (Time moment, NiChange change, NiChangesPerBand::iterator niIt);
 };
 
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/mgt-headers.cc ns-3.35/src/wifi/model/mgt-headers.cc
--- ns-3.34/src/wifi/model/mgt-headers.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/mgt-headers.cc	2021-10-01 13:26:48.000000000 -0700
@@ -360,12 +360,24 @@
   m_edcaParameterSet = edcaParameters;
 }
 
+void
+MgtProbeResponseHeader::SetMuEdcaParameterSet (MuEdcaParameterSet muEdcaParameters)
+{
+  m_muEdcaParameterSet = muEdcaParameters;
+}
+
 EdcaParameterSet
 MgtProbeResponseHeader::GetEdcaParameterSet (void) const
 {
   return m_edcaParameterSet;
 }
 
+MuEdcaParameterSet
+MgtProbeResponseHeader::GetMuEdcaParameterSet (void) const
+{
+  return m_muEdcaParameterSet;
+}
+
 TypeId
 MgtProbeResponseHeader::GetTypeId (void)
 {
@@ -403,6 +415,7 @@
   size += m_vhtOperation.GetSerializedSize ();
   size += m_heCapability.GetSerializedSize ();
   size += m_heOperation.GetSerializedSize ();
+  size += m_muEdcaParameterSet.GetSerializedSize ();
   return size;
 }
 
@@ -450,6 +463,7 @@
   i = m_vhtOperation.Serialize (i);
   i = m_heCapability.Serialize (i);
   i = m_heOperation.Serialize (i);
+  i = m_muEdcaParameterSet.Serialize (i);
 }
 
 uint32_t
@@ -473,6 +487,7 @@
   i = m_vhtOperation.DeserializeIfPresent (i);
   i = m_heCapability.DeserializeIfPresent (i);
   i = m_heOperation.DeserializeIfPresent (i);
+  i = m_muEdcaParameterSet.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
 
@@ -1045,12 +1060,24 @@
   m_edcaParameterSet = edcaparameters;
 }
 
+void
+MgtAssocResponseHeader::SetMuEdcaParameterSet (MuEdcaParameterSet muEdcaParameters)
+{
+  m_muEdcaParameterSet = muEdcaParameters;
+}
+
 EdcaParameterSet
 MgtAssocResponseHeader::GetEdcaParameterSet (void) const
 {
   return m_edcaParameterSet;
 }
 
+MuEdcaParameterSet
+MgtAssocResponseHeader::GetMuEdcaParameterSet (void) const
+{
+  return m_muEdcaParameterSet;
+}
+
 TypeId
 MgtAssocResponseHeader::GetTypeId (void)
 {
@@ -1086,6 +1113,7 @@
   size += m_vhtOperation.GetSerializedSize ();
   size += m_heCapability.GetSerializedSize ();
   size += m_heOperation.GetSerializedSize ();
+  size += m_muEdcaParameterSet.GetSerializedSize ();
   return size;
 }
 
@@ -1123,6 +1151,7 @@
   i = m_vhtOperation.Serialize (i);
   i = m_heCapability.Serialize (i);
   i = m_heOperation.Serialize (i);
+  i = m_muEdcaParameterSet.Serialize (i);
 }
 
 uint32_t
@@ -1143,6 +1172,7 @@
   i = m_vhtOperation.DeserializeIfPresent (i);
   i = m_heCapability.DeserializeIfPresent (i);
   i = m_heOperation.DeserializeIfPresent (i);
+  i = m_muEdcaParameterSet.DeserializeIfPresent (i);
   return i.GetDistanceFrom (start);
 }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/mgt-headers.h ns-3.35/src/wifi/model/mgt-headers.h
--- ns-3.34/src/wifi/model/mgt-headers.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/mgt-headers.h	2021-10-01 13:26:48.000000000 -0700
@@ -38,6 +38,7 @@
 #include "edca-parameter-set.h"
 #include "ns3/he-capabilities.h"
 #include "ns3/he-operation.h"
+#include "ns3/mu-edca-parameter-set.h"
 
 namespace ns3 {
 
@@ -400,6 +401,12 @@
    */
   EdcaParameterSet GetEdcaParameterSet (void) const;
   /**
+   * Return the MU EDCA Parameter Set.
+   *
+   * \return the MU EDCA Parameter Set
+   */
+  MuEdcaParameterSet GetMuEdcaParameterSet (void) const;
+  /**
    * Set the Capability information.
    *
    * \param capabilities Capability information
@@ -466,6 +473,12 @@
    */
   void SetEdcaParameterSet (EdcaParameterSet edcaParameterSet);
   /**
+   * Set the MU EDCA Parameter Set.
+   *
+   * \param muEdcaParameterSet the MU EDCA Parameter Set
+   */
+  void SetMuEdcaParameterSet (MuEdcaParameterSet muEdcaParameterSet);
+  /**
    * Set the HE capabilities.
    *
    * \param heCapabilities HE capabilities
@@ -504,6 +517,7 @@
   EdcaParameterSet m_edcaParameterSet; //!< EDCA Parameter Set
   HeCapabilities m_heCapability; //!< HE capabilities
   HeOperation m_heOperation; //!< HE operation
+  MuEdcaParameterSet m_muEdcaParameterSet; //!< MU EDCA Parameter Set
 };
 
 
@@ -706,6 +720,12 @@
    */
   EdcaParameterSet GetEdcaParameterSet (void) const;
   /**
+   * Return the MU EDCA Parameter Set.
+   *
+   * \return the MU EDCA Parameter Set
+   */
+  MuEdcaParameterSet GetMuEdcaParameterSet (void) const;
+  /**
    * Set the Capability information.
    *
    * \param capabilities Capability information
@@ -790,6 +810,12 @@
    */
   void SetEdcaParameterSet (EdcaParameterSet edcaParameterSet);
   /**
+   * Set the MU EDCA Parameter Set.
+   *
+   * \param muEdcaParameterSet the MU EDCA Parameter Set
+   */
+  void SetMuEdcaParameterSet (MuEdcaParameterSet muEdcaParameterSet);
+  /**
    * Return the time stamp.
    *
    * \return time stamp
@@ -824,6 +850,7 @@
   HeOperation m_heOperation;         //!< HE operation
   ErpInformation m_erpInformation;     //!< ERP information
   EdcaParameterSet m_edcaParameterSet; //!< EDCA Parameter Set
+  MuEdcaParameterSet m_muEdcaParameterSet; //!< MU EDCA Parameter Set
 };
 
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/mpdu-aggregator.cc ns-3.35/src/wifi/model/mpdu-aggregator.cc
--- ns-3.34/src/wifi/model/mpdu-aggregator.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/mpdu-aggregator.cc	2021-10-01 13:26:48.000000000 -0700
@@ -126,28 +126,7 @@
   AcIndex ac = QosUtilsMapTidToAc (tid);
 
   // Find the A-MPDU max size configured on this device
-  UintegerValue size;
-
-  switch (ac)
-    {
-      case AC_BE:
-        m_mac->GetAttribute ("BE_MaxAmpduSize", size);
-        break;
-      case AC_BK:
-        m_mac->GetAttribute ("BK_MaxAmpduSize", size);
-        break;
-      case AC_VI:
-        m_mac->GetAttribute ("VI_MaxAmpduSize", size);
-        break;
-      case AC_VO:
-        m_mac->GetAttribute ("VO_MaxAmpduSize", size);
-        break;
-      default:
-        NS_ABORT_MSG ("Unknown AC " << ac);
-        return 0;
-    }
-
-  uint32_t maxAmpduSize = size.Get ();
+  uint32_t maxAmpduSize = m_mac->GetMaxAmpduSize (ac);
 
   if (maxAmpduSize == 0)
     {
@@ -213,7 +192,7 @@
 
 std::vector<Ptr<WifiMacQueueItem>>
 MpduAggregator::GetNextAmpdu (Ptr<WifiMacQueueItem> mpdu, WifiTxParameters& txParams,
-                              Time availableTime, WifiMacQueueItem::QueueIteratorPair queueIt) const
+                              Time availableTime, WifiMacQueueItem::ConstIterator queueIt) const
 {
   NS_LOG_FUNCTION (this << *mpdu << &txParams << availableTime);
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/mpdu-aggregator.h ns-3.35/src/wifi/model/mpdu-aggregator.h
--- ns-3.34/src/wifi/model/mpdu-aggregator.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/mpdu-aggregator.h	2021-10-01 13:26:48.000000000 -0700
@@ -125,7 +125,7 @@
   std::vector<Ptr<WifiMacQueueItem>> GetNextAmpdu (Ptr<WifiMacQueueItem> mpdu,
                                                    WifiTxParameters& txParams,
                                                    Time availableTime,
-                                                   WifiMacQueueItem::QueueIteratorPair queueIt) const;
+                                                   WifiMacQueueItem::ConstIterator queueIt) const;
 
   /**
    * Set the MAC layer to use.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/msdu-aggregator.cc ns-3.35/src/wifi/model/msdu-aggregator.cc
--- ns-3.34/src/wifi/model/msdu-aggregator.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/msdu-aggregator.cc	2021-10-01 13:26:48.000000000 -0700
@@ -84,14 +84,13 @@
 
 Ptr<WifiMacQueueItem>
 MsduAggregator::GetNextAmsdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
-                              Time availableTime, WifiMacQueueItem::QueueIteratorPair& queueIt) const
+                              Time availableTime, WifiMacQueueItem::ConstIterator& queueIt) const
 {
   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 ());
+  Ptr<WifiMacQueue> queue = m_mac->GetTxopQueue (peekedItem->GetQueueAc ());
+  auto it = peekedItem->GetQueueIterator ();
+  NS_ASSERT ((*it)->GetPacket () == peekedItem->GetPacket ());
 
   uint8_t tid = peekedItem->GetHeader ().GetQosTid ();
   Mac48Address recipient = peekedItem->GetHeader ().GetAddr1 ();
@@ -120,16 +119,28 @@
       return nullptr;
     }
 
-  Ptr<WifiMacQueueItem> amsdu = Copy (peekedItem);
+  Ptr<WifiMacQueueItem> amsdu = *it;  // amsdu points to the peeked MPDU, but it's non-const
   uint8_t nMsdu = 1;
 
-  peekedIt.it++;
+  it++;
 
-  while ((peekedIt.it = peekedIt.queue->PeekByTidAndAddress (tid, recipient, peekedIt.it)) != peekedIt.queue->end ()
-         && m_htFem->TryAggregateMsdu (*peekedIt.it, txParams, availableTime))
+  while ((it = queue->PeekByTidAndAddress (tid, recipient, it)) != queue->end ()
+         && m_htFem->TryAggregateMsdu (*it, txParams, availableTime))
     {
-      amsdu->Aggregate (*peekedIt.it);
-      peekedIt.it++;
+      // dequeue the MSDU being aggregated and advance the current iterator
+      // before it is invalidated
+      Ptr<WifiMacQueueItem> msdu = *it++;
+      queue->DequeueIfQueued (msdu);
+
+      auto pos = std::next (amsdu->GetQueueIterator ());
+      queue->DequeueIfQueued (amsdu);
+
+      amsdu->Aggregate (msdu);
+      bool ret = queue->Insert (pos, amsdu);
+      // The size of a WifiMacQueue is measured as number of packets. We dequeued
+      // two packets, so there is certainly room for inserting one packet
+      NS_ABORT_IF (!ret);
+
       nMsdu++;
     }
 
@@ -140,7 +151,7 @@
     }
 
   // Aggregation succeeded
-  queueIt = peekedIt;
+  queueIt = it;
 
   return amsdu;
 }
@@ -160,28 +171,7 @@
   AcIndex ac = QosUtilsMapTidToAc (tid);
 
   // Find the A-MSDU max size configured on this device
-  UintegerValue size;
-
-  switch (ac)
-    {
-      case AC_BE:
-        m_mac->GetAttribute ("BE_MaxAmsduSize", size);
-        break;
-      case AC_BK:
-        m_mac->GetAttribute ("BK_MaxAmsduSize", size);
-        break;
-      case AC_VI:
-        m_mac->GetAttribute ("VI_MaxAmsduSize", size);
-        break;
-      case AC_VO:
-        m_mac->GetAttribute ("VO_MaxAmsduSize", size);
-        break;
-      default:
-        NS_ABORT_MSG ("Unknown AC " << ac);
-        return 0;
-    }
-
-  uint16_t maxAmsduSize = size.Get ();
+  uint16_t maxAmsduSize = m_mac->GetMaxAmsduSize (ac);
 
   if (maxAmsduSize == 0)
     {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/msdu-aggregator.h ns-3.35/src/wifi/model/msdu-aggregator.h
--- ns-3.34/src/wifi/model/msdu-aggregator.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/msdu-aggregator.h	2021-10-01 13:26:48.000000000 -0700
@@ -88,19 +88,21 @@
    * 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.
+   * If aggregation succeeds (it was possible to aggregate at least an MSDU to the
+   * given MSDU), all the aggregated MSDUs are dequeued and an MPDU containing the
+   * A-MSDU is enqueued in the queue (replacing the given MPDU) and returned.
+   * Otherwise, no MSDU is dequeued from the EDCA queue and a null pointer is returned.
    *
    * \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
+   * \param[out] queueIt a queue iterator 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;
+                                      Time availableTime, WifiMacQueueItem::ConstIterator& queueIt) const;
 
   /**
    * Determine the maximum size for an A-MSDU of the given TID that can be sent
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/nist-error-rate-model.cc ns-3.35/src/wifi/model/nist-error-rate-model.cc
--- ns-3.34/src/wifi/model/nist-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/nist-error-rate-model.cc	2021-10-01 13:26:48.000000000 -0700
@@ -220,11 +220,7 @@
 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 << +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)
+  if (mode.GetModulationClass () >= WIFI_MOD_CLASS_ERP_OFDM)
     {
       if (mode.GetConstellationSize () == 2)
         {
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/phy-entity.cc ns-3.35/src/wifi/model/phy-entity.cc
--- ns-3.34/src/wifi/model/phy-entity.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/phy-entity.cc	2021-10-01 13:26:48.000000000 -0700
@@ -297,7 +297,7 @@
             AbortCurrentReception (status.reason);
             if (event->GetEndTime () > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
               {
-                m_wifiPhy->MaybeCcaBusyDuration (GetMeasurementChannelWidth (ppdu));
+                m_wifiPhy->SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (ppdu));
               }
             break;
           case DROP:
@@ -359,7 +359,7 @@
 }
 
 void
-PhyEntity::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW,
+PhyEntity::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand& rxPowersW,
                                  Time /* rxDuration */)
 {
   //The total RX power corresponds to the maximum over all the bands
@@ -383,7 +383,7 @@
       NS_LOG_DEBUG ("Cannot start RX because device is OFF");
       if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
         {
-          m_wifiPhy->MaybeCcaBusyDuration (m_wifiPhy->GetMeasurementChannelWidth (nullptr));
+          m_wifiPhy->SwitchMaybeToCcaBusy (m_wifiPhy->GetMeasurementChannelWidth (nullptr));
         }
       return;
     }
@@ -393,7 +393,7 @@
       NS_LOG_DEBUG ("Packet reception stopped because transmitter has been switched off");
       if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
         {
-          m_wifiPhy->MaybeCcaBusyDuration (GetMeasurementChannelWidth (ppdu));
+          m_wifiPhy->SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (ppdu));
         }
       return;
     }
@@ -490,7 +490,7 @@
   if (endRx > (Simulator::Now () + m_state->GetDelayUntilIdle ()))
     {
       //that PPDU will be noise _after_ the end of the current event.
-      m_wifiPhy->MaybeCcaBusyDuration (measurementChannelWidth);
+      m_wifiPhy->SwitchMaybeToCcaBusy (measurementChannelWidth);
     }
 }
 
@@ -603,8 +603,6 @@
   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) <<
@@ -615,7 +613,7 @@
   signalNoiseIt->second = rxInfo.second;
 
   RxSignalInfo rxSignalInfo;
-  rxSignalInfo.snr = snr;
+  rxSignalInfo.snr = rxInfo.second.signal / rxInfo.second.noise;
   rxSignalInfo.rssi = rxInfo.second.signal;
 
   auto statusPerMpduIt = m_statusPerMpduMap.find (std::make_pair (ppdu->GetUid (), staId));
@@ -665,7 +663,7 @@
     }
 
   DoEndReceivePayload (ppdu);
-  m_wifiPhy->MaybeCcaBusyDuration (GetMeasurementChannelWidth (ppdu));
+  m_wifiPhy->SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (ppdu));
 }
 
 void
@@ -736,7 +734,7 @@
 }
 
 Ptr<Event>
-PhyEntity::DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW)
+PhyEntity::DoGetEvent (Ptr<const WifiPpdu> ppdu, RxPowerWattPerChannelBand& rxPowersW)
 {
   Ptr<Event> event = CreateInterferenceEvent (ppdu, ppdu->GetTxVector (), ppdu->GetTxDuration (), rxPowersW);
 
@@ -748,13 +746,13 @@
 }
 
 Ptr<Event>
-PhyEntity::CreateInterferenceEvent (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing /* = false */)
+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)
+PhyEntity::UpdateInterferenceEvent (Ptr<Event> event, const RxPowerWattPerChannelBand& rxPower)
 {
   m_wifiPhy->m_interference.UpdateEvent (event, rxPower);
 }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/phy-entity.h ns-3.35/src/wifi/model/phy-entity.h
--- ns-3.34/src/wifi/model/phy-entity.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/phy-entity.h	2021-10-01 13:26:48.000000000 -0700
@@ -358,7 +358,7 @@
    * \param rxPowersW the receive power in W per band
    * \param rxDuration the duration of the PPDU
    */
-  virtual void StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW,
+  virtual void StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand& rxPowersW,
                                      Time rxDuration);
   /**
    * Start receiving a given field.
@@ -522,7 +522,7 @@
    * \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);
+  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.
@@ -717,14 +717,14 @@
    *
    * \copydoc InterferenceHelper::Add
    */
-  Ptr<Event> CreateInterferenceEvent (Ptr<const WifiPpdu> ppdu, const WifiTxVector& txVector, Time duration, RxPowerWattPerChannelBand rxPower, bool isStartOfdmaRxing = false);
+  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);
+  void UpdateInterferenceEvent (Ptr<Event> event, const RxPowerWattPerChannelBand& rxPower);
   /**
    * Notify WifiPhy's InterferenceHelper of the end of the reception,
    * clear maps and end of MPDU event, and eventually reset WifiPhy.
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/qos-frame-exchange-manager.cc ns-3.35/src/wifi/model/qos-frame-exchange-manager.cc
--- ns-3.34/src/wifi/model/qos-frame-exchange-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/qos-frame-exchange-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -47,6 +47,12 @@
                    BooleanValue (true),
                    MakeBooleanAccessor (&QosFrameExchangeManager::m_pifsRecovery),
                    MakeBooleanChecker ())
+    .AddAttribute ("SetQueueSize",
+                   "Whether to set the Queue Size subfield of the QoS Control field "
+                   "of QoS data frames sent by non-AP stations",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&QosFrameExchangeManager::m_setQosQueueSize),
+                   MakeBooleanChecker ())
   ;
   return tid;
 }
@@ -271,7 +277,7 @@
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (mpdu->GetHeader ());
 
-  WifiMacQueueItem::QueueIteratorPair queueIt;
+  WifiMacQueueItem::ConstIterator queueIt;
   Ptr<WifiMacQueueItem> item = edca->GetNextMpdu (mpdu, txParams, availableTime, initialFrame, queueIt);
 
   if (item == nullptr)
@@ -511,6 +517,23 @@
 }
 
 void
+QosFrameExchangeManager::ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector)
+{
+  NS_LOG_FUNCTION (this << *mpdu << txVector);
+
+  WifiMacHeader& hdr = mpdu->GetHeader ();
+
+  if (hdr.IsQosData () && m_mac->GetTypeOfStation () == STA
+      && (m_setQosQueueSize || hdr.IsQosEosp ()))
+    {
+      uint8_t tid = hdr.GetQosTid ();
+      hdr.SetQosEosp ();
+      hdr.SetQosQueueSize (m_mac->GetQosTxop (tid)->GetQosQueueSize (tid, hdr.GetAddr1 ()));
+    }
+  FrameExchangeManager::ForwardMpduDown (mpdu, txVector);
+}
+
+void
 QosFrameExchangeManager::TransmissionSucceeded (void)
 {
   NS_LOG_DEBUG (this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/qos-frame-exchange-manager.h ns-3.35/src/wifi/model/qos-frame-exchange-manager.h
--- ns-3.34/src/wifi/model/qos-frame-exchange-manager.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/qos-frame-exchange-manager.h	2021-10-01 13:26:48.000000000 -0700
@@ -105,6 +105,7 @@
                                Time response) const override;
   void TransmissionSucceeded (void) override;
   void TransmissionFailed (void) override;
+  void ForwardMpduDown (Ptr<WifiMacQueueItem> mpdu, WifiTxVector& txVector) override;
 
   /**
    * Request the FrameExchangeManager to start a frame exchange sequence.
@@ -157,6 +158,8 @@
 
   Ptr<QosTxop> m_edca;                       //!< the EDCAF that gained channel access
   Mac48Address m_txopHolder;                 //!< MAC address of the TXOP holder
+  bool m_setQosQueueSize;                    /**< whether to set the Queue Size subfield of the
+                                                  QoS Control field of QoS data frames */
 
 private:
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/qos-txop.cc ns-3.35/src/wifi/model/qos-txop.cc
--- ns-3.34/src/wifi/model/qos-txop.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/qos-txop.cc	2021-10-01 13:26:48.000000000 -0700
@@ -32,7 +32,6 @@
 #include "wifi-mac-trailer.h"
 #include "wifi-mac-queue.h"
 #include "qos-blocked-destinations.h"
-#include "wifi-remote-station-manager.h"
 #include "msdu-aggregator.h"
 #include "mpdu-aggregator.h"
 #include "ctrl-headers.h"
@@ -42,7 +41,7 @@
 #include "wifi-tx-parameters.h"
 
 #undef NS_LOG_APPEND_CONTEXT
-#define NS_LOG_APPEND_CONTEXT if (m_stationManager != 0 && m_stationManager->GetMac () != 0) { std::clog << "[mac=" << m_stationManager->GetMac ()->GetAddress () << "] "; }
+#define NS_LOG_APPEND_CONTEXT if (m_mac != 0) { std::clog << "[mac=" << m_mac->GetAddress () << "] "; }
 
 namespace ns3 {
 
@@ -91,9 +90,16 @@
   return tid;
 }
 
-QosTxop::QosTxop ()
-  : m_startTxop (Seconds (0)),
-    m_txopDuration (Seconds (0))
+QosTxop::QosTxop (AcIndex ac)
+  : Txop (CreateObject<WifiMacQueue> (ac)),
+    m_ac (ac),
+    m_startTxop (Seconds (0)),
+    m_txopDuration (Seconds (0)),
+    m_muCwMin (0),
+    m_muCwMax (0),
+    m_muAifsn (0),
+    m_muEdcaTimer (Seconds (0)),
+    m_muEdcaTimerStartTime (Seconds (0))
 {
   NS_LOG_FUNCTION (this);
   m_qosBlockedDestinations = Create<QosBlockedDestinations> ();
@@ -101,6 +107,7 @@
   m_baManager->SetQueue (m_queue);
   m_baManager->SetBlockDestinationCallback (MakeCallback (&QosBlockedDestinations::Block, m_qosBlockedDestinations));
   m_baManager->SetUnblockDestinationCallback (MakeCallback (&QosBlockedDestinations::Unblock, m_qosBlockedDestinations));
+  m_queue->TraceConnectWithoutContext ("Expired", MakeCallback (&BlockAckManager::NotifyDiscardedMpdu, m_baManager));
 }
 
 QosTxop::~QosTxop ()
@@ -112,26 +119,24 @@
 QosTxop::DoDispose (void)
 {
   NS_LOG_FUNCTION (this);
+  if (m_baManager != 0)
+    {
+      m_baManager->Dispose ();
+    }
   m_baManager = 0;
   m_qosBlockedDestinations = 0;
   m_qosFem = 0;
   Txop::DoDispose ();
 }
 
-void
-QosTxop::SetQosQueueSize (Ptr<WifiMacQueueItem> mpdu)
+uint8_t
+QosTxop::GetQosQueueSize (uint8_t tid, Mac48Address receiver) const
 {
-  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 ());
+  uint32_t bufferSize = m_queue->GetNBytes (tid, receiver);
   // 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);
+  return queueSize;
 }
 
 void
@@ -146,9 +151,92 @@
 {
   NS_LOG_FUNCTION (this << &callback);
   Txop::SetDroppedMpduCallback (callback);
-  m_baManager->GetRetransmitQueue ()->TraceConnectWithoutContext ("Expired",
-                                                                  m_droppedMpduCallback
-                                                                  .Bind (WIFI_MAC_DROP_EXPIRED_LIFETIME));
+  m_baManager->SetDroppedOldMpduCallback (callback.Bind (WIFI_MAC_DROP_QOS_OLD_PACKET));
+}
+
+void
+QosTxop::SetMuCwMin (uint16_t cwMin)
+{
+  NS_LOG_FUNCTION (this << cwMin);
+  m_muCwMin = cwMin;
+}
+
+void
+QosTxop::SetMuCwMax (uint16_t cwMax)
+{
+  NS_LOG_FUNCTION (this << cwMax);
+  m_muCwMax = cwMax;
+}
+
+void
+QosTxop::SetMuAifsn (uint8_t aifsn)
+{
+  NS_LOG_FUNCTION (this << +aifsn);
+  m_muAifsn = aifsn;
+}
+
+void
+QosTxop::SetMuEdcaTimer (Time timer)
+{
+  NS_LOG_FUNCTION (this << timer);
+  m_muEdcaTimer = timer;
+}
+
+void
+QosTxop::StartMuEdcaTimerNow (void)
+{
+  NS_LOG_FUNCTION (this);
+  m_muEdcaTimerStartTime = Simulator::Now ();
+  if (EdcaDisabled ())
+    {
+      NS_LOG_DEBUG ("Disable EDCA for " << m_muEdcaTimer.As (Time::MS));
+      m_channelAccessManager->DisableEdcaFor (this, m_muEdcaTimer);
+    }
+}
+
+bool
+QosTxop::MuEdcaTimerRunning (void) const
+{
+  return (m_muEdcaTimerStartTime.IsStrictlyPositive () && m_muEdcaTimer.IsStrictlyPositive ()
+          && m_muEdcaTimerStartTime + m_muEdcaTimer > Simulator::Now ());
+}
+
+bool
+QosTxop::EdcaDisabled (void) const
+{
+  return (MuEdcaTimerRunning () && m_muAifsn == 0);
+}
+
+uint32_t
+QosTxop::GetMinCw (void) const
+{
+  if (!MuEdcaTimerRunning ())
+    {
+      return m_cwMin;
+    }
+  NS_ASSERT (!EdcaDisabled ());
+  return m_muCwMin;
+}
+
+uint32_t
+QosTxop::GetMaxCw (void) const
+{
+  if (!MuEdcaTimerRunning ())
+    {
+      return m_cwMax;
+    }
+  NS_ASSERT (!EdcaDisabled ());
+  return m_muCwMax;
+}
+
+uint8_t
+QosTxop::GetAifsn (void) const
+{
+  if (!MuEdcaTimerRunning ())
+    {
+      return m_aifsn;
+    }
+  return m_muAifsn;
 }
 
 Ptr<BlockAckManager>
@@ -188,7 +276,7 @@
   WifiMacHeader hdr;
   hdr.SetType (WIFI_MAC_CTL_BACKREQ);
   hdr.SetAddr1 (recipient);
-  hdr.SetAddr2 (m_stationManager->GetMac ()->GetAddress ());
+  hdr.SetAddr2 (m_mac->GetAddress ());
   hdr.SetDsNotTo ();
   hdr.SetDsNotFrom ();
   hdr.SetNoRetry ();
@@ -203,14 +291,6 @@
   m_baManager->ScheduleBar (bar, skipIfNoDataQueued);
 }
 
-void
-QosTxop::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> remoteManager)
-{
-  Txop::SetWifiRemoteStationManager (remoteManager);
-  NS_LOG_FUNCTION (this << remoteManager);
-  m_baManager->SetWifiRemoteStationManager (m_stationManager);
-}
-
 bool
 QosTxop::UseExplicitBarAfterMissedBlockAck (void) const
 {
@@ -220,10 +300,10 @@
 bool
 QosTxop::HasFramesToTransmit (void)
 {
-  // check if the BA manager retransmit queue is empty, so that expired
+  // check if the BA manager has anything to send, 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 ();
+  bool baManagerHasPackets = (m_baManager->GetBar (false) != 0);
   // 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.
@@ -276,11 +356,11 @@
 Ptr<const WifiMacQueueItem>
 QosTxop::PeekNextMpdu (uint8_t tid, Mac48Address recipient)
 {
-  return PeekNextMpdu ({nullptr, WifiMacQueue::EMPTY}, tid, recipient);
+  return PeekNextMpdu (WifiMacQueue::EMPTY, tid, recipient);
 }
 
 Ptr<const WifiMacQueueItem>
-QosTxop::PeekNextMpdu (WifiMacQueueItem::QueueIteratorPair queueIt, uint8_t tid, Mac48Address recipient)
+QosTxop::PeekNextMpdu (WifiMacQueueItem::ConstIterator queueIt, uint8_t tid, Mac48Address recipient)
 {
   NS_LOG_FUNCTION (this << +tid << recipient);
 
@@ -289,50 +369,55 @@
     {
       if (tid == 8 && recipient.IsBroadcast ())  // undefined TID and recipient
         {
-          return queueIt.queue->PeekFirstAvailable (m_qosBlockedDestinations, queueIt.it);
+          return m_queue->PeekFirstAvailable (m_qosBlockedDestinations, queueIt);
         }
       if (m_qosBlockedDestinations->IsBlocked (recipient, tid))
         {
-          return queueIt.queue->end ();
+          return m_queue->end ();
         }
-      return queueIt.queue->PeekByTidAndAddress (tid, recipient, queueIt.it);
+      return m_queue->PeekByTidAndAddress (tid, recipient, queueIt);
     };
 
-  if (queueIt.queue == nullptr && queueIt.it == WifiMacQueue::EMPTY)
-    {
-      // check if there is a packet in the BlockAckManager retransmit queue
-      queueIt.queue = PeekPointer (m_baManager->GetRetransmitQueue ());
-    }
-
-  if (queueIt.queue == PeekPointer (m_baManager->GetRetransmitQueue ()))
+  queueIt = peek ();
+  // remove old packets (must be retransmissions or in flight, otherwise they did
+  // not get a sequence number assigned)
+  while (queueIt != m_queue->end () && !(*queueIt)->IsFragment ())
     {
-      queueIt.it = peek ();
-      // remove old packets
-      while (queueIt.it != m_baManager->GetRetransmitQueue ()->end () && IsQosOldPacket (*queueIt.it))
+      if (((*queueIt)->GetHeader ().IsRetry () || (*queueIt)->IsInFlight ())
+          && IsQosOldPacket (*queueIt))
         {
-          NS_LOG_DEBUG ("Removing an old packet from BlockAckManager retransmit queue: " << **queueIt.it);
-          queueIt.it = m_baManager->GetRetransmitQueue ()->Remove (queueIt.it);
-          queueIt.it = peek ();
+          NS_LOG_DEBUG ("Removing an old packet from EDCA queue: " << **queueIt);
+          if (!m_droppedMpduCallback.IsNull ())
+            {
+              m_droppedMpduCallback (WIFI_MAC_DROP_QOS_OLD_PACKET, *queueIt);
+            }
+          queueIt = m_queue->Remove (queueIt);
+          queueIt = peek ();
         }
-      if (queueIt.it != m_baManager->GetRetransmitQueue ()->end ())
+      else if ((*queueIt)->IsInFlight ())
+        {
+          NS_LOG_DEBUG ("Skipping in flight MPDU: " << **queueIt);
+          ++queueIt;
+          queueIt = peek ();
+        }
+      else
         {
-          NS_LOG_DEBUG ("Packet peeked from BlockAckManager retransmit queue: " << **queueIt.it);
-          return *queueIt.it;
+          break;
         }
-      // otherwise, check if there is a packet in the EDCA queue
-      queueIt = {PeekPointer (m_queue), WifiMacQueue::EMPTY};
     }
-
-  queueIt.it = peek ();
-  if (queueIt.it != m_queue->end ())
+  if (queueIt != m_queue->end ())
     {
+      NS_ASSERT (!(*queueIt)->IsInFlight ());
+      WifiMacHeader& hdr = (*queueIt)->GetHeader ();
+
       // 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 (&(*queueIt.it)->GetHeader ());
-      if ((*queueIt.it)->GetHeader ().IsQosData ())
+      uint16_t sequence = (hdr.IsRetry () ? hdr.GetSequenceNumber ()
+                                          : m_txMiddle->PeekNextSequenceNumberFor (&hdr));
+      if (hdr.IsQosData ())
         {
-          Mac48Address recipient = (*queueIt.it)->GetHeader ().GetAddr1 ();
-          uint8_t tid = (*queueIt.it)->GetHeader ().GetQosTid ();
+          Mac48Address recipient = hdr.GetAddr1 ();
+          uint8_t tid = hdr.GetQosTid ();
 
           if (GetBaAgreementEstablished (recipient, tid)
               && !IsInWindow (sequence, GetBaStartingSequence (recipient, tid), GetBaBufferSize (recipient, tid)))
@@ -342,14 +427,13 @@
             }
         }
 
-      WifiMacHeader& hdr = (*queueIt.it)->GetHeader ();
       // Assign a sequence number if this is not a fragment nor a retransmission
-      if (!(*queueIt.it)->IsFragment () && !hdr.IsRetry ())
+      if (!(*queueIt)->IsFragment () && !hdr.IsRetry ())
         {
           hdr.SetSequenceNumber (sequence);
         }
-      NS_LOG_DEBUG ("Packet peeked from EDCA queue: " << **queueIt.it);
-      return *queueIt.it;
+      NS_LOG_DEBUG ("Packet peeked from EDCA queue: " << **queueIt);
+      return *queueIt;
     }
 
   return 0;
@@ -357,7 +441,7 @@
 
 Ptr<WifiMacQueueItem>
 QosTxop::GetNextMpdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
-                      Time availableTime, bool initialFrame, WifiMacQueueItem::QueueIteratorPair& queueIt)
+                      Time availableTime, bool initialFrame, WifiMacQueueItem::ConstIterator& queueIt)
 {
   NS_ASSERT (peekedItem != 0);
   NS_ASSERT (m_qosFem != 0);
@@ -377,40 +461,9 @@
     }
 
   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));
+  WifiMacQueueItem::ConstIterator peekedIt = peekedItem->GetQueueIterator ();
+  NS_ASSERT ((*peekedIt)->GetPacket () == peekedItem->GetPacket ());
+  NS_ASSERT ((*peekedIt)->GetQueueAc () == m_ac);
   Ptr<WifiMacQueueItem> mpdu;
 
   // If it is a non-broadcast QoS Data frame and it is not a retransmission nor a fragment,
@@ -428,8 +481,9 @@
                                 GetBaBufferSize (recipient, tid)));
 
       // try A-MSDU aggregation
-      if (m_stationManager->GetHtSupported () && !recipient.IsBroadcast ()
-          && !peekedItem->GetHeader ().IsRetry () && !peekedItem->IsFragment ())
+      if (m_mac->GetHtSupported () && !recipient.IsBroadcast ()
+          && !peekedItem->GetHeader ().IsRetry () && !peekedItem->IsFragment ()
+          && !peekedItem->IsInFlight ())
         {
           Ptr<HtFrameExchangeManager> htFem = StaticCast<HtFrameExchangeManager> (m_qosFem);
           mpdu = htFem->GetMsduAggregator ()->GetNextAmsdu (peekedItem, txParams, availableTime, peekedIt);
@@ -444,8 +498,8 @@
 
   if (mpdu == 0)
     {
-      mpdu = *peekedIt.it;
-      peekedIt.it++;
+      mpdu = *peekedIt;
+      peekedIt++;
     }
 
   // Assign a sequence number if this is not a fragment nor a retransmission
@@ -461,7 +515,7 @@
 {
   NS_LOG_FUNCTION (this << *mpdu);
 
-  if (!mpdu->IsFragment () && !mpdu->GetHeader ().IsRetry ())
+  if (!mpdu->IsFragment () && !mpdu->GetHeader ().IsRetry () && !mpdu->IsInFlight ())
     {
       uint16_t sequence = m_txMiddle->GetNextSequenceNumberFor (&mpdu->GetHeader ());
       mpdu->GetHeader ().SetSequenceNumber (sequence);
@@ -481,88 +535,6 @@
 }
 
 void
-QosTxop::NotifyInternalCollision (void)
-{
-  NS_LOG_FUNCTION (this);
-
-  // 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)
-    {
-      m_stationManager->ReportDataFailed (mpdu);
-
-      if (!mpdu->GetHeader ().GetAddr1 ().IsGroup () && !m_stationManager->NeedRetransmission (mpdu))
-        {
-          NS_LOG_DEBUG ("reset DCF");
-          m_stationManager->ReportFinalDataFailed (mpdu);
-          if (!m_droppedMpduCallback.IsNull ())
-            {
-              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;
-
-          if (mpdu->GetHeader ().IsQosData ()
-              && GetBaAgreementEstablished (receiver, mpdu->GetHeader ().GetQosTid ()))
-            {
-              uint8_t tid = mpdu->GetHeader ().GetQosTid ();
-              testIt = m_baManager->GetRetransmitQueue ()->PeekByTidAndAddress (tid, receiver);
-
-              if (testIt != m_baManager->GetRetransmitQueue ()->end ())
-                {
-                  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);
-                }
-            }
-
-          if (!found)
-            {
-              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 ());
-                }
-            }
-        }
-      else
-        {
-          NS_LOG_DEBUG ("Update CW");
-          UpdateFailedCw ();
-        }
-    }
-
-  GenerateBackoff ();
-  m_access = NOT_REQUESTED;
-  if (HasFramesToTransmit ())
-    {
-      m_channelAccessManager->RequestAccess (this);
-    }
-}
-
-void
 QosTxop::NotifyChannelAccessed (Time txopDuration)
 {
   NS_LOG_FUNCTION (this << txopDuration);
@@ -609,13 +581,6 @@
 }
 
 void
-QosTxop::SetAccessCategory (AcIndex ac)
-{
-  NS_LOG_FUNCTION (this << +ac);
-  m_ac = ac;
-}
-
-void
 QosTxop::PushFront (Ptr<const Packet> packet, const WifiMacHeader &hdr)
 {
   NS_LOG_FUNCTION (this << packet << &hdr);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/qos-txop.h ns-3.35/src/wifi/model/qos-txop.h
--- ns-3.34/src/wifi/model/qos-txop.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/qos-txop.h	2021-10-01 13:26:48.000000000 -0700
@@ -44,9 +44,8 @@
  * \ingroup wifi
  *
  * This class implements the packet fragmentation and retransmission policy for
- * QoS data frames. It uses the ns3::MacLow and ns3::ChannelAccessManager helper classes
- * to respectively send packets and decide when to send them. Packets are stored
- * in a ns3::WifiMacQueue until they can be sent.
+ * QoS data frames. It uses the ns3::ChannelAccessManager helper class to decide
+ * when to send a packet. Packets are stored in a ns3::WifiMacQueue until they can be sent.
  *
  * This queue contains packets for a particular access class.
  * Possibles access classes are:
@@ -56,8 +55,6 @@
  *   - AC_BK : background, TID = 1,2
  *
  * This class also implements block ack sessions and MSDU aggregation (A-MSDU).
- * If A-MSDU is enabled for that access class, it picks several packets from the
- * queue instead of a single one and sends the aggregated packet to ns3::MacLow.
  *
  * The fragmentation policy currently implemented uses a simple
  * threshold: any packet bigger than this threshold is fragmented
@@ -80,14 +77,17 @@
    */
   static TypeId GetTypeId (void);
 
-  QosTxop ();
+  /**
+   * Constructor
+   *
+   * \param ac the Access Category
+   */
+  QosTxop (AcIndex ac = AC_UNDEF);
+
   virtual ~QosTxop ();
 
   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;
@@ -100,6 +100,13 @@
   void SetQosFrameExchangeManager (const Ptr<QosFrameExchangeManager> qosFem);
 
   /**
+   * Get the access category of this object.
+   *
+   * \return the access category.
+   */
+  AcIndex GetAccessCategory (void) const;
+
+  /**
    * Return true if an explicit BlockAckRequest is sent after a missed BlockAck
    *
    * \return true if an explicit BlockAckRequest is sent after a missed BlockAck
@@ -212,13 +219,6 @@
   void ResetBa (Mac48Address recipient, uint8_t tid);
 
   /**
-   * Set the access category of this EDCAF.
-   *
-   * \param ac access category.
-   */
-  void SetAccessCategory (AcIndex ac);
-
-  /**
    * \param packet packet to send.
    * \param hdr header of packet to send.
    *
@@ -332,7 +332,7 @@
    * \param recipient the receiver station address.
    * \returns the peeked frame.
    */
-  Ptr<const WifiMacQueueItem> PeekNextMpdu (WifiMacQueueItem::QueueIteratorPair queueIt,
+  Ptr<const WifiMacQueueItem> PeekNextMpdu (WifiMacQueueItem::ConstIterator queueIt,
                                             uint8_t tid = 8,
                                             Mac48Address recipient = Mac48Address::GetBroadcast ());
   /**
@@ -351,14 +351,14 @@
                           (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
+   * \param[out] queueIt a queue iterator 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
    */
   Ptr<WifiMacQueueItem> GetNextMpdu (Ptr<const WifiMacQueueItem> peekedItem, WifiTxParameters& txParams,
                                      Time availableTime, bool initialFrame,
-                                     WifiMacQueueItem::QueueIteratorPair& queueIt);
+                                     WifiMacQueueItem::ConstIterator& queueIt);
 
   /**
    * Assign a sequence number to the given MPDU, if it is not a fragment
@@ -369,11 +369,14 @@
   void AssignSequenceNumber (Ptr<WifiMacQueueItem> mpdu) const;
 
   /**
-   * Set the Queue Size subfield of the QoS Control field of the given QoS data frame.
+   * Get the value for the Queue Size subfield of the QoS Control field of a
+   * QoS data frame of the given TID and addressed to the given receiver.
    *
-   * \param mpdu the given QoS data frame
+   * \param tid the Traffic ID
+   * \param receiver the address of the given receiver
+   * \return the value for the Queue Size subfield
    */
-  void SetQosQueueSize (Ptr<WifiMacQueueItem> mpdu);
+  uint8_t GetQosQueueSize (uint8_t tid, Mac48Address receiver) const;
 
   /**
    * Return true if a TXOP has started.
@@ -388,6 +391,75 @@
    */
   virtual Time GetRemainingTxop (void) const;
 
+  /**
+   * Set the minimum contention window size to use while the MU EDCA Timer
+   * is running.
+   *
+   * \param cwMin the minimum contention window size.
+   */
+  void SetMuCwMin (uint16_t cwMin);
+  /**
+   * Set the maximum contention window size to use while the MU EDCA Timer
+   * is running.
+   *
+   * \param cwMax the maximum contention window size.
+   */
+  void SetMuCwMax (uint16_t cwMax);
+  /**
+   * Set the number of slots that make up an AIFS while the MU EDCA Timer
+   * is running.
+   *
+   * \param aifsn the number of slots that make up an AIFS.
+   */
+  void SetMuAifsn (uint8_t aifsn);
+  /**
+   * Set the MU EDCA Timer.
+   *
+   * \param timer the timer duration.
+   */
+  void SetMuEdcaTimer (Time timer);
+  /**
+   * Start the MU EDCA Timer.
+   */
+  void StartMuEdcaTimerNow (void);
+  /**
+   * Return true if the MU EDCA Timer is running, false otherwise.
+   *
+   * \return whether the MU EDCA Timer is running
+   */
+  bool MuEdcaTimerRunning (void) const;
+  /**
+   * Return true if the EDCA is disabled (the MU EDCA Timer is running and the
+   * MU AIFSN is zero), false otherwise.
+   *
+   * \return whether the EDCA is disabled
+   */
+  bool EdcaDisabled (void) const;
+  /**
+   * Return the minimum contention window size from the EDCA Parameter Set
+   * or the MU EDCA Parameter Set, depending on whether the MU EDCA Timer is
+   * running or not.
+   *
+   * \return the currently used minimum contention window size.
+   */
+  uint32_t GetMinCw (void) const override;
+  /**
+   * Return the maximum contention window size from the EDCA Parameter Set
+   * or the MU EDCA Parameter Set, depending on whether the MU EDCA Timer is
+   * running or not.
+   *
+   * \return the currently used maximum contention window size.
+   */
+  uint32_t GetMaxCw (void) const override;
+  /**
+   * Return the number of slots that make up an AIFS according to the
+   * EDCA Parameter Set or the MU EDCA Parameter Set, depending on whether the
+   * MU EDCA Timer is running or not.
+   *
+   * \return the number of slots that currently make up an AIFS.
+   */
+  uint8_t GetAifsn (void) const override;
+
 protected:
   void DoDispose (void) override;
 
@@ -422,6 +494,12 @@
   Time m_failedAddBaTimeout;                            //!< timeout after failed BA agreement
   bool m_useExplicitBarAfterMissedBlockAck;             //!< flag whether explicit BlockAckRequest should be sent upon missed BlockAck Response
 
+  uint32_t m_muCwMin;          //!< the MU CW minimum
+  uint32_t m_muCwMax;          //!< the MU CW maximum
+  uint8_t m_muAifsn;           //!< the MU AIFSN
+  Time m_muEdcaTimer;          //!< the MU EDCA Timer
+  Time m_muEdcaTimerStartTime; //!< last start time of the MU EDCA Timer
+
   TracedCallback<Time, Time> m_txopTrace; //!< TXOP trace callback
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/qos-utils.h ns-3.35/src/wifi/model/qos-utils.h
--- ns-3.34/src/wifi/model/qos-utils.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/qos-utils.h	2021-10-01 13:26:48.000000000 -0700
@@ -77,8 +77,11 @@
   AC_VI = 2,
   /** Voice */
   AC_VO = 3,
-  /** Total number of ACs */
+  /** Non-QoS */
   AC_BE_NQOS = 4,
+  /** Beacon queue */
+  AC_BEACON = 5,
+  /** Total number of ACs */
   AC_UNDEF
 };
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/regular-wifi-mac.cc ns-3.35/src/wifi/model/regular-wifi-mac.cc
--- ns-3.34/src/wifi/model/regular-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/regular-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
@@ -37,6 +37,7 @@
 #include <cmath>
 #include "ns3/he-frame-exchange-manager.h"
 #include "channel-access-manager.h"
+#include "wifi-mac-queue.h"
 
 namespace ns3 {
 
@@ -59,6 +60,7 @@
 
   m_txop = CreateObject<Txop> ();
   m_txop->SetChannelAccessManager (m_channelAccessManager);
+  m_txop->SetWifiMac (this);
   m_txop->SetTxMiddle (m_txMiddle);
   m_txop->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
                                                 &m_droppedMpduCallback));
@@ -182,11 +184,6 @@
 {
   NS_LOG_FUNCTION (this << stationManager);
   m_stationManager = stationManager;
-  m_txop->SetWifiRemoteStationManager (stationManager);
-  for (EdcaQueues::const_iterator i = m_edca.begin (); i != m_edca.end (); ++i)
-    {
-      i->second->SetWifiRemoteStationManager (stationManager);
-    }
 }
 
 Ptr<WifiRemoteStationManager>
@@ -467,8 +464,9 @@
   //already configured.
   NS_ASSERT (m_edca.find (ac) == m_edca.end ());
 
-  Ptr<QosTxop> edca = CreateObject<QosTxop> ();
+  Ptr<QosTxop> edca = CreateObject<QosTxop> (ac);
   edca->SetChannelAccessManager (m_channelAccessManager);
+  edca->SetWifiMac (this);
   edca->SetTxMiddle (m_txMiddle);
   edca->GetBaManager ()->SetTxOkCallback (MakeCallback (&MpduTracedCallback::operator(),
                                                         &m_ackedMpduCallback));
@@ -476,7 +474,6 @@
                                                             &m_nackedMpduCallback));
   edca->SetDroppedMpduCallback (MakeCallback (&DroppedMpduTracedCallback::operator(),
                                               &m_droppedMpduCallback));
-  edca->SetAccessCategory (ac);
 
   m_edca.insert (std::make_pair (ac, edca));
 }
@@ -536,6 +533,17 @@
   return m_edca.find (AC_BK)->second;
 }
 
+Ptr<WifiMacQueue>
+RegularWifiMac::GetTxopQueue (AcIndex ac) const
+{
+  if (ac == AC_BE_NQOS)
+    {
+      return m_txop->GetWifiMacQueue ();
+    }
+  NS_ASSERT (ac == AC_BE || ac == AC_BK || ac == AC_VI || ac == AC_VO);
+  return m_edca.find (ac)->second->GetWifiMacQueue ();
+}
+
 void
 RegularWifiMac::SetWifiPhy (const Ptr<WifiPhy> phy)
 {
@@ -1152,4 +1160,54 @@
     }
 }
 
+uint32_t
+RegularWifiMac::GetMaxAmpduSize (AcIndex ac) const
+{
+  uint32_t maxSize = 0;
+  switch (ac)
+    {
+      case AC_BE:
+        maxSize = m_beMaxAmpduSize;
+        break;
+      case AC_BK:
+        maxSize = m_bkMaxAmpduSize;
+        break;
+      case AC_VI:
+        maxSize = m_viMaxAmpduSize;
+        break;
+      case AC_VO:
+        maxSize = m_voMaxAmpduSize;
+        break;
+      default:
+        NS_ABORT_MSG ("Unknown AC " << ac);
+        return 0;
+    }
+  return maxSize;
+}
+
+uint16_t
+RegularWifiMac::GetMaxAmsduSize (AcIndex ac) const
+{
+  uint16_t maxSize = 0;
+  switch (ac)
+    {
+      case AC_BE:
+        maxSize = m_beMaxAmsduSize;
+        break;
+      case AC_BK:
+        maxSize = m_bkMaxAmsduSize;
+        break;
+      case AC_VI:
+        maxSize = m_viMaxAmsduSize;
+        break;
+      case AC_VO:
+        maxSize = m_voMaxAmsduSize;
+        break;
+      default:
+        NS_ABORT_MSG ("Unknown AC " << ac);
+        return 0;
+    }
+  return maxSize;
+}
+
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/regular-wifi-mac.h ns-3.35/src/wifi/model/regular-wifi-mac.h
--- ns-3.34/src/wifi/model/regular-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/regular-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
@@ -35,6 +35,7 @@
 class ExtendedCapabilities;
 class FrameExchangeManager;
 class WifiPsdu;
+class WifiMacQueue;
 enum WifiTxTimerReason : uint8_t;
 
 typedef std::unordered_map <uint16_t /* staId */, Ptr<WifiPsdu> /* PSDU */> WifiPsduMap;
@@ -123,6 +124,50 @@
    * \return a smart pointer to a QosTxop
    */
   Ptr<QosTxop> GetQosTxop (uint8_t tid) const;
+  /**
+   * Get the wifi MAC queue of the (Qos)Txop associated with the given AC.
+   *
+   * \param ac the given Access Category
+   * \return the wifi MAC queue of the (Qos)Txop associated with the given AC
+   */
+  virtual Ptr<WifiMacQueue> GetTxopQueue (AcIndex ac) const;
+
+  /**
+   * Return whether the device supports QoS.
+   *
+   * \return true if QoS is supported, false otherwise
+   */
+  bool GetQosSupported () const;
+  /**
+   * Return whether the device supports ERP.
+   *
+   * \return true if ERP is supported, false otherwise
+   */
+  bool GetErpSupported () const;
+  /**
+   * Return whether the device supports DSSS.
+   *
+   * \return true if DSSS is supported, false otherwise
+   */
+  bool GetDsssSupported () const;
+  /**
+   * Return whether the device supports HT.
+   *
+   * \return true if HT is supported, false otherwise
+   */
+  bool GetHtSupported () const;
+  /**
+   * Return whether the device supports VHT.
+   *
+   * \return true if VHT is supported, false otherwise
+   */
+  bool GetVhtSupported () const;
+  /**
+   * Return whether the device supports HE.
+   *
+   * \return true if HE is supported, false otherwise
+   */
+  bool GetHeSupported () const;
 
   /**
    * Return the extended capabilities of the device.
@@ -149,6 +194,21 @@
    */
   HeCapabilities GetHeCapabilities (void) const;
 
+  /**
+   * Return the maximum A-MPDU size of the given Access Category.
+   *
+   * \param ac Access Category index
+   * \return the maximum A-MPDU size
+   */
+  uint32_t GetMaxAmpduSize (AcIndex ac) const;
+  /**
+   * Return the maximum A-MSDU size of the given Access Category.
+   *
+   * \param ac Access Category index
+   * \return the maximum A-MSDU size
+   */
+  uint16_t GetMaxAmsduSize (AcIndex ac) const;
+
 protected:
   void DoInitialize () override;
   void DoDispose () override;
@@ -252,12 +312,6 @@
    * \param enable whether QoS is supported
    */
   virtual void SetQosSupported (bool enable);
-  /**
-   * Return whether the device supports QoS.
-   *
-   * \return true if QoS is supported, false otherwise
-   */
-  bool GetQosSupported () const;
 
   /**
    * Create a Frame Exchange Manager depending on the supported version
@@ -266,31 +320,11 @@
   void SetupFrameExchangeManager (void);
 
   /**
-   * Return whether the device supports HT.
-   *
-   * \return true if HT is supported, false otherwise
-   */
-  bool GetHtSupported () const;
-
-  /**
-   * Return whether the device supports VHT.
-   *
-   * \return true if VHT is supported, false otherwise
-   */
-  bool GetVhtSupported () const;
-
-  /**
    * Enable or disable ERP support for the device.
    *
    * \param enable whether ERP is supported
    */
   void SetErpSupported (bool enable);
-  /**
-   * Return whether the device supports ERP.
-   *
-   * \return true if ERP is supported, false otherwise
-   */
-  bool GetErpSupported () const;
 
   /**
    * Enable or disable DSSS support for the device.
@@ -298,19 +332,6 @@
    * \param enable whether DSSS is supported
    */
   void SetDsssSupported (bool enable);
-  /**
-   * Return whether the device supports DSSS.
-   *
-   * \return true if DSSS is supported, false otherwise
-   */
-  bool GetDsssSupported () const;
-
-  /**
-   * Return whether the device supports HE.
-   *
-   * \return true if HE is supported, false otherwise
-   */
-  bool GetHeSupported () const;
 
 private:
   /// type conversion operator
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/spectrum-wifi-phy.cc ns-3.35/src/wifi/model/spectrum-wifi-phy.cc
--- ns-3.34/src/wifi/model/spectrum-wifi-phy.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/spectrum-wifi-phy.cc	2021-10-01 13:26:48.000000000 -0700
@@ -304,10 +304,9 @@
   if ((channelWidth == 5) || (channelWidth == 10))
     {
       WifiSpectrumBand filteredBand = GetBand (channelWidth);
-      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: " << Integral (filteredSignal));
-      double rxPowerPerBandW = Integral (filteredSignal) * DbToRatio (GetRxGain ());
+      double rxPowerPerBandW = WifiSpectrumValueHelper::GetBandPowerW (receivedSignalPsd, filteredBand);
+      NS_LOG_DEBUG ("Signal power received (watts) before antenna gain: " << rxPowerPerBandW);
+      rxPowerPerBandW *= DbToRatio (GetRxGain ());
       totalRxPowerW += rxPowerPerBandW;
       rxPowerW.insert ({filteredBand, rxPowerPerBandW});
       NS_LOG_DEBUG ("Signal power received after antenna gain for " << channelWidth << " MHz channel: " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
@@ -319,10 +318,9 @@
         {
           NS_ASSERT (channelWidth >= bw);
           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));
-          double rxPowerPerBandW = Integral (filteredSignal) * DbToRatio (GetRxGain ());
+          double rxPowerPerBandW = WifiSpectrumValueHelper::GetBandPowerW (receivedSignalPsd, filteredBand);
+          NS_LOG_DEBUG ("Signal power received (watts) before antenna gain for " << bw << " MHz channel band " << +i << ": " << rxPowerPerBandW);
+          rxPowerPerBandW *= 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)");
         }
@@ -332,10 +330,9 @@
   for (uint8_t i = 0; i < (channelWidth / 20); i++)
     {
       WifiSpectrumBand filteredBand = GetBand (20, 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 20 MHz channel band " << +i << ": " << Integral (filteredSignal));
-      double rxPowerPerBandW = Integral (filteredSignal) * DbToRatio (GetRxGain ());
+      double rxPowerPerBandW = WifiSpectrumValueHelper::GetBandPowerW (receivedSignalPsd, filteredBand);
+      NS_LOG_DEBUG ("Signal power received (watts) before antenna gain for 20 MHz channel band " << +i << ": " << rxPowerPerBandW);
+      rxPowerPerBandW *= DbToRatio (GetRxGain ());
       totalRxPowerW += rxPowerPerBandW;
       rxPowerW.insert ({filteredBand, rxPowerPerBandW});
       NS_LOG_DEBUG ("Signal power received after antenna gain for 20 MHz channel band " << +i << ": " << rxPowerPerBandW << " W (" << WToDbm (rxPowerPerBandW) << " dBm)");
@@ -346,10 +343,9 @@
       NS_ASSERT (!m_ruBands[channelWidth].empty ());
       for (const auto& bandRuPair : m_ruBands[channelWidth])
         {
-          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 ());
+          double rxPowerPerBandW = WifiSpectrumValueHelper::GetBandPowerW (receivedSignalPsd, bandRuPair.first);
+          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 <<  "): " << rxPowerPerBandW);
+          rxPowerPerBandW *= 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});
         }
@@ -383,6 +379,9 @@
   if (totalRxPowerW < DbmToW (GetRxSensitivity ()) * (txWidth / 20.0))
     {
       NS_LOG_INFO ("Received signal too weak to process: " << WToDbm (totalRxPowerW) << " dBm");
+      m_interference.Add (wifiRxParams->ppdu, wifiRxParams->ppdu->GetTxVector (), rxDuration,
+                          rxPowerW);
+      SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (wifiRxParams->ppdu));
       return;
     }
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/sta-wifi-mac.cc ns-3.35/src/wifi/model/sta-wifi-mac.cc
--- ns-3.34/src/wifi/model/sta-wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/sta-wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
@@ -821,6 +821,19 @@
                 }
             }
         }
+
+      MuEdcaParameterSet muEdcaParameters = beacon.GetMuEdcaParameterSet ();
+      if (muEdcaParameters.IsPresent ())
+        {
+          SetMuEdcaParameters (AC_BE, muEdcaParameters.GetMuCwMin (AC_BE), muEdcaParameters.GetMuCwMax (AC_BE),
+                               muEdcaParameters.GetMuAifsn (AC_BE), muEdcaParameters.GetMuEdcaTimer (AC_BE));
+          SetMuEdcaParameters (AC_BK, muEdcaParameters.GetMuCwMin (AC_BK), muEdcaParameters.GetMuCwMax (AC_BK),
+                               muEdcaParameters.GetMuAifsn (AC_BK), muEdcaParameters.GetMuEdcaTimer (AC_BK));
+          SetMuEdcaParameters (AC_VI, muEdcaParameters.GetMuCwMin (AC_VI), muEdcaParameters.GetMuCwMax (AC_VI),
+                               muEdcaParameters.GetMuAifsn (AC_VI), muEdcaParameters.GetMuEdcaTimer (AC_VI));
+          SetMuEdcaParameters (AC_VO, muEdcaParameters.GetMuCwMin (AC_VO), muEdcaParameters.GetMuCwMax (AC_VO),
+                               muEdcaParameters.GetMuAifsn (AC_VO), muEdcaParameters.GetMuEdcaTimer (AC_VO));
+        }
     }
   m_stationManager->SetShortPreambleEnabled (isShortPreambleEnabled);
   m_stationManager->SetShortSlotTimeEnabled (capabilities.IsShortSlotTime ());
@@ -981,6 +994,19 @@
           HeOperation heOperation = assocResp.GetHeOperation ();
           GetHeConfiguration ()->SetAttribute ("BssColor", UintegerValue (heOperation.GetBssColor ()));
         }
+
+      MuEdcaParameterSet muEdcaParameters = assocResp.GetMuEdcaParameterSet ();
+      if (muEdcaParameters.IsPresent ())
+        {
+          SetMuEdcaParameters (AC_BE, muEdcaParameters.GetMuCwMin (AC_BE), muEdcaParameters.GetMuCwMax (AC_BE),
+                               muEdcaParameters.GetMuAifsn (AC_BE), muEdcaParameters.GetMuEdcaTimer (AC_BE));
+          SetMuEdcaParameters (AC_BK, muEdcaParameters.GetMuCwMin (AC_BK), muEdcaParameters.GetMuCwMax (AC_BK),
+                               muEdcaParameters.GetMuAifsn (AC_BK), muEdcaParameters.GetMuEdcaTimer (AC_BK));
+          SetMuEdcaParameters (AC_VI, muEdcaParameters.GetMuCwMin (AC_VI), muEdcaParameters.GetMuCwMax (AC_VI),
+                               muEdcaParameters.GetMuAifsn (AC_VI), muEdcaParameters.GetMuEdcaTimer (AC_VI));
+          SetMuEdcaParameters (AC_VO, muEdcaParameters.GetMuCwMin (AC_VO), muEdcaParameters.GetMuCwMax (AC_VO),
+                               muEdcaParameters.GetMuAifsn (AC_VO), muEdcaParameters.GetMuEdcaTimer (AC_VO));
+        }
     }
   for (const auto & mode : m_phy->GetModeList ())
     {
@@ -1084,7 +1110,7 @@
 void
 StaWifiMac::SetEdcaParameters (AcIndex ac, uint32_t cwMin, uint32_t cwMax, uint8_t aifsn, Time txopLimit)
 {
-  Ptr<QosTxop> edca = m_edca.find (ac)->second;
+  Ptr<QosTxop> edca = GetQosTxop (ac);
   edca->SetMinCw (cwMin);
   edca->SetMaxCw (cwMax);
   edca->SetAifsn (aifsn);
@@ -1092,6 +1118,16 @@
 }
 
 void
+StaWifiMac::SetMuEdcaParameters (AcIndex ac, uint16_t cwMin, uint16_t cwMax, uint8_t aifsn, Time muEdcaTimer)
+{
+  Ptr<QosTxop> edca = GetQosTxop (ac);
+  edca->SetMuCwMin (cwMin);
+  edca->SetMuCwMax (cwMax);
+  edca->SetMuAifsn (aifsn);
+  edca->SetMuEdcaTimer (muEdcaTimer);
+}
+
+void
 StaWifiMac::PhyCapabilitiesChanged (void)
 {
   NS_LOG_FUNCTION (this);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/sta-wifi-mac.h ns-3.35/src/wifi/model/sta-wifi-mac.h
--- ns-3.34/src/wifi/model/sta-wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/sta-wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
@@ -291,6 +291,16 @@
    */
   void SetEdcaParameters (AcIndex ac, uint32_t cwMin, uint32_t cwMax, uint8_t aifsn, Time txopLimit);
   /**
+   * Set the MU EDCA parameters.
+   *
+   * \param ac the Access Category
+   * \param cwMin the minimum contention window size
+   * \param cwMax the maximum contention window size
+   * \param aifsn the number of slots that make up an AIFS
+   * \param muEdcaTimer the MU EDCA timer
+   */
+  void SetMuEdcaParameters (AcIndex ac, uint16_t cwMin, uint16_t cwMax, uint8_t aifsn, Time muEdcaTimer);
+  /**
    * Return the Capability information of the current STA.
    *
    * \return the Capability information that we support
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/table-based-error-rate-model.cc ns-3.35/src/wifi/model/table-based-error-rate-model.cc
--- ns-3.34/src/wifi/model/table-based-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/table-based-error-rate-model.cc	2021-10-01 13:26:48.000000000 -0700
@@ -132,7 +132,7 @@
             }
         }
     }
-  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT || mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
+  else if (mode.GetModulationClass () >= WIFI_MOD_CLASS_HT)
     {
       mcs = mode.GetMcsValue ();
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/txop.cc ns-3.35/src/wifi/model/txop.cc
--- ns-3.34/src/wifi/model/txop.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/txop.cc	2021-10-01 13:26:48.000000000 -0700
@@ -25,14 +25,13 @@
 #include "ns3/socket.h"
 #include "txop.h"
 #include "channel-access-manager.h"
-#include "wifi-mac.h"
+#include "regular-wifi-mac.h"
 #include "wifi-mac-queue.h"
 #include "mac-tx-middle.h"
-#include "wifi-remote-station-manager.h"
 #include "wifi-mac-trailer.h"
 
 #undef NS_LOG_APPEND_CONTEXT
-#define NS_LOG_APPEND_CONTEXT if (m_stationManager != 0 && m_stationManager->GetMac () != 0) { std::clog << "[mac=" << m_stationManager->GetMac ()->GetAddress () << "] "; }
+#define NS_LOG_APPEND_CONTEXT if (m_mac != 0) { std::clog << "[mac=" << m_mac->GetAddress () << "] "; }
 
 namespace ns3 {
 
@@ -84,7 +83,13 @@
 }
 
 Txop::Txop ()
+  : Txop (CreateObject<WifiMacQueue> (AC_BE_NQOS))
+{
+}
+
+Txop::Txop (Ptr<WifiMacQueue> queue)
   : m_channelAccessManager (0),
+    m_queue (queue),
     m_cwMin (0),
     m_cwMax (0),
     m_cw (0),
@@ -94,7 +99,6 @@
     m_backoffStart (Seconds (0.0))
 {
   NS_LOG_FUNCTION (this);
-  m_queue = CreateObject<WifiMacQueue> ();
   m_rng = CreateObject<UniformRandomVariable> ();
 }
 
@@ -108,7 +112,7 @@
 {
   NS_LOG_FUNCTION (this);
   m_queue = 0;
-  m_stationManager = 0;
+  m_mac = 0;
   m_rng = 0;
   m_txMiddle = 0;
   m_channelAccessManager = 0;
@@ -129,10 +133,10 @@
 }
 
 void
-Txop::SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> remoteManager)
+Txop::SetWifiMac (const Ptr<RegularWifiMac> mac)
 {
-  NS_LOG_FUNCTION (this << remoteManager);
-  m_stationManager = remoteManager;
+  NS_LOG_FUNCTION (this << mac);
+  m_mac = mac;
 }
 
 void
@@ -187,7 +191,7 @@
 Txop::ResetCw (void)
 {
   NS_LOG_FUNCTION (this);
-  m_cw = m_cwMin;
+  m_cw = GetMinCw ();
   m_cwTrace = m_cw;
 }
 
@@ -196,7 +200,9 @@
 {
   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_cw = std::min ( 2 * (m_cw + 1) - 1, GetMaxCw ());
+  // if the MU EDCA timer is running, CW cannot be less than MU CW min
+  m_cw = std::max (m_cw, GetMinCw ());
   m_cwTrace = m_cw;
 }
 
@@ -376,14 +382,6 @@
 }
 
 void
-Txop::NotifyInternalCollision (void)
-{
-  NS_LOG_FUNCTION (this);
-  GenerateBackoff ();
-  StartAccessIfNeeded ();
-}
-
-void
 Txop::NotifyChannelSwitching (void)
 {
   NS_LOG_FUNCTION (this);
@@ -423,10 +421,4 @@
   return false;
 }
 
-AcIndex
-Txop::GetAccessCategory (void) const
-{
-  return AC_BE_NQOS;
-}
-
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/txop.h ns-3.35/src/wifi/model/txop.h
--- ns-3.34/src/wifi/model/txop.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/txop.h	2021-10-01 13:26:48.000000000 -0700
@@ -34,9 +34,8 @@
 class WifiMacQueueItem;
 class UniformRandomVariable;
 class CtrlBAckResponseHeader;
-class WifiRemoteStationManager;
+class RegularWifiMac;
 enum WifiMacDropReason : uint8_t;  // opaque enum declaration
-enum AcIndex : uint8_t;
 
 /**
  * \brief Handle packet fragmentation and retransmissions
@@ -45,9 +44,9 @@
  *
  * This class implements the packet fragmentation and
  * retransmission policy for data and management frames.
- * It uses the ns3::MacLow and ns3::ChannelAccessManager helper
- * classes to respectively send packets and decide when
- * to send them. Packets are stored in a ns3::WifiMacQueue
+ * It uses the ns3::ChannelAccessManager helper
+ * class to decide when to send a packet.
+ * Packets are stored in a ns3::WifiMacQueue
  * until they can be sent.
  *
  * The policy currently implemented uses a simple fragmentation
@@ -65,10 +64,15 @@
 class Txop : public Object
 {
 public:
-  /// allow MacLowTransmissionListener class access
-  friend class MacLowTransmissionListener;
-
   Txop ();
+
+  /**
+   * Constructor
+   *
+   * \param queue the wifi MAC queue
+   */
+  Txop (Ptr<WifiMacQueue> queue);
+
   virtual ~Txop ();
 
   /**
@@ -98,12 +102,6 @@
    * \returns true if QoS TXOP.
    */
   virtual bool IsQosTxop () const;
-  /**
-   * Get the access category.
-   *
-   * \return the access category.
-   */
-  virtual AcIndex GetAccessCategory (void) const;
 
   /**
    * Set ChannelAccessManager this Txop is associated to.
@@ -112,11 +110,11 @@
    */
   void SetChannelAccessManager (const Ptr<ChannelAccessManager> manager);
   /**
-   * Set WifiRemoteStationsManager this Txop is associated to.
+   * Set the wifi MAC this Txop is associated to.
    *
-   * \param remoteManager WifiRemoteStationManager to associate.
+   * \param mac associated wifi MAC
    */
-  virtual void SetWifiRemoteStationManager (const Ptr<WifiRemoteStationManager> remoteManager);
+  virtual void SetWifiMac (const Ptr<RegularWifiMac> mac);
   /**
    * Set MacTxMiddle this Txop is associated to.
    *
@@ -166,19 +164,19 @@
    *
    * \return the minimum contention window size.
    */
-  uint32_t GetMinCw (void) const;
+  virtual uint32_t GetMinCw (void) const;
   /**
    * Return the maximum contention window size.
    *
    * \return the maximum contention window size.
    */
-  uint32_t GetMaxCw (void) const;
+  virtual uint32_t GetMaxCw (void) const;
   /**
    * Return the number of slots that make up an AIFS.
    *
    * \return the number of slots that make up an AIFS.
    */
-  uint8_t GetAifsn (void) const;
+  virtual uint8_t GetAifsn (void) const;
   /**
    * Return the TXOP limit.
    *
@@ -280,10 +278,6 @@
    * Notify that access request has been received.
    */
   virtual void NotifyAccessRequested (void);
-  /**
-   * Notify the Txop that internal collision has occurred.
-   */
-  virtual void NotifyInternalCollision (void);
 
   /**
    * Check if the Txop has frames to transmit.
@@ -332,7 +326,7 @@
   DroppedMpdu m_droppedMpduCallback;                //!< the dropped MPDU callback
   Ptr<WifiMacQueue> m_queue;                        //!< the wifi MAC queue
   Ptr<MacTxMiddle> m_txMiddle;                      //!< the MacTxMiddle
-  Ptr<WifiRemoteStationManager> m_stationManager;   //!< the wifi remote station manager
+  Ptr<RegularWifiMac> m_mac;                        //!< the wifi MAC
   Ptr<UniformRandomVariable> m_rng;                 //!< the random stream
 
   uint32_t m_cwMin;              //!< the minimum contention window
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-default-ack-manager.cc ns-3.35/src/wifi/model/wifi-default-ack-manager.cc
--- ns-3.34/src/wifi/model/wifi-default-ack-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-default-ack-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -152,7 +152,7 @@
   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->GetBaManager ()->GetNBufferedPackets (receiver, tid) > 1)
       && !(edca->GetTxopLimit ().IsStrictlyPositive ()
            && edca->GetRemainingTxop () == edca->GetTxopLimit ()
            && !(txParams.m_protection && txParams.m_protection->method == WifiProtection::RTS_CTS)))
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-information-element.h ns-3.35/src/wifi/model/wifi-information-element.h
--- ns-3.34/src/wifi/model/wifi-information-element.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-information-element.h	2021-10-01 13:26:48.000000000 -0700
@@ -190,6 +190,8 @@
 
 #define IE_EXT_HE_CAPABILITIES                  ((WifiInformationElementId)35)
 #define IE_EXT_HE_OPERATION                     ((WifiInformationElementId)36)
+#define IE_EXT_UORA_PARAMETER_SET               ((WifiInformationElementId)37)
+#define IE_EXT_MU_EDCA_PARAMETER_SET            ((WifiInformationElementId)38)
 
 /**
  * \brief Information element, as defined in 802.11-2007 standard
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-mac.cc ns-3.35/src/wifi/model/wifi-mac.cc
--- ns-3.34/src/wifi/model/wifi-mac.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-mac.cc	2021-10-01 13:26:48.000000000 -0700
@@ -174,6 +174,9 @@
       dcf->SetAifsn (2);
       dcf->SetTxopLimit (MicroSeconds (0));
       break;
+    case AC_BEACON:
+      // done by ApWifiMac
+      break;
     case AC_UNDEF:
       NS_FATAL_ERROR ("I don't know what to do with this");
       break;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-mac.h ns-3.35/src/wifi/model/wifi-mac.h
--- ns-3.34/src/wifi/model/wifi-mac.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-mac.h	2021-10-01 13:26:48.000000000 -0700
@@ -55,7 +55,8 @@
 {
   WIFI_MAC_DROP_FAILED_ENQUEUE = 0,
   WIFI_MAC_DROP_EXPIRED_LIFETIME,
-  WIFI_MAC_DROP_REACHED_RETRY_LIMIT
+  WIFI_MAC_DROP_REACHED_RETRY_LIMIT,
+  WIFI_MAC_DROP_QOS_OLD_PACKET
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-mac-queue.cc ns-3.35/src/wifi/model/wifi-mac-queue.cc
--- ns-3.34/src/wifi/model/wifi-mac-queue.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-mac-queue.cc	2021-10-01 13:26:48.000000000 -0700
@@ -62,8 +62,8 @@
   return tid;
 }
 
-WifiMacQueue::WifiMacQueue ()
-  : m_expiredPacketsPresent (false),
+WifiMacQueue::WifiMacQueue (AcIndex ac)
+  : m_ac (ac),
     NS_LOG_TEMPLATE_DEFINE ("WifiMacQueue")
 {
 }
@@ -93,21 +93,6 @@
 }
 
 bool
-WifiMacQueue::TtlExceeded (ConstIterator &it)
-{
-  if (Simulator::Now () > (*it)->GetTimeStamp () + m_maxDelay)
-    {
-      NS_LOG_DEBUG ("Removing packet that stayed in the queue for too long (" <<
-                    Simulator::Now () - (*it)->GetTimeStamp () << ")");
-      m_traceExpired (*it);
-      auto curr = it++;
-      DoRemove (curr);
-      return true;
-    }
-  return false;
-}
-
-bool
 WifiMacQueue::Enqueue (Ptr<WifiMacQueueItem> item)
 {
   NS_LOG_FUNCTION (this << *item);
@@ -138,13 +123,14 @@
 
   // the queue is full; scan the list in the attempt to remove stale packets
   ConstIterator it = begin ();
+  const Time now = Simulator::Now ();
   while (it != end ())
     {
-      if (it == pos && TtlExceeded (it))
+      if (it == pos && TtlExceeded (it, now))
         {
           return DoEnqueue (it, item);
         }
-      if (TtlExceeded (it))
+      if (TtlExceeded (it, now))
         {
           return DoEnqueue (pos, item);
         }
@@ -174,9 +160,10 @@
 WifiMacQueue::Dequeue (void)
 {
   NS_LOG_FUNCTION (this);
+  const Time now = Simulator::Now ();
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           return DoDequeue (it);
         }
@@ -185,111 +172,33 @@
   return 0;
 }
 
-Ptr<WifiMacQueueItem>
-WifiMacQueue::DequeueByAddress (Mac48Address dest)
-{
-  NS_LOG_FUNCTION (this << dest);
-  ConstIterator it = PeekByAddress (dest);
-
-  if (it == end ())
-    {
-      return 0;
-    }
-  return Dequeue (it);
-}
-
-Ptr<WifiMacQueueItem>
-WifiMacQueue::DequeueByTid (uint8_t tid)
-{
-  NS_LOG_FUNCTION (this << +tid);
-  ConstIterator it = PeekByTid (tid);
-
-  if (it == end ())
-    {
-      return 0;
-    }
-  return Dequeue (it);
-}
-
-Ptr<WifiMacQueueItem>
-WifiMacQueue::DequeueByTidAndAddress (uint8_t tid, Mac48Address dest)
-{
-  NS_LOG_FUNCTION (this << +tid << dest);
-  ConstIterator it = PeekByTidAndAddress (tid, dest);
-
-  if (it == end ())
-    {
-      return 0;
-    }
-  return Dequeue (it);
-}
-
-Ptr<WifiMacQueueItem>
-WifiMacQueue::DequeueFirstAvailable (const Ptr<QosBlockedDestinations> blockedPackets)
-{
-  NS_LOG_FUNCTION (this);
-  ConstIterator it = PeekFirstAvailable (blockedPackets);
-
-  if (it == end ())
-    {
-      return 0;
-    }
-  return Dequeue (it);
-}
-
-Ptr<WifiMacQueueItem>
-WifiMacQueue::Dequeue (ConstIterator pos)
+void
+WifiMacQueue::DequeueIfQueued (Ptr<const WifiMacQueueItem> mpdu)
 {
-  NS_LOG_FUNCTION (this);
-
-  if (!m_expiredPacketsPresent)
-    {
-      if (TtlExceeded (pos))
-        {
-          NS_LOG_DEBUG ("Packet lifetime expired");
-          return 0;
-        }
-      return DoDequeue (pos);
-    }
+  NS_LOG_FUNCTION (this << *mpdu);
 
-  // remove stale items queued before the given position
-  ConstIterator it = begin ();
-  while (it != end ())
+  if (mpdu->IsQueued ())
     {
-      if (it == pos)
-        {
-          // reset the flag signaling the presence of expired packets before returning
-          m_expiredPacketsPresent = false;
+      NS_ASSERT (mpdu->m_queueAc == m_ac);
+      NS_ASSERT (*mpdu->m_queueIt == mpdu);
 
-          if (TtlExceeded (it))
-            {
-              return 0;
-            }
-          return DoDequeue (it);
-        }
-      else if (!TtlExceeded (it))
-        {
-          it++;
-        }
+      DoDequeue (mpdu->m_queueIt);
     }
-  NS_LOG_DEBUG ("Invalid iterator");
-  return 0;
 }
 
 Ptr<const WifiMacQueueItem>
 WifiMacQueue::Peek (void) const
 {
   NS_LOG_FUNCTION (this);
+  const Time now = Simulator::Now ();
   for (auto it = begin (); it != end (); it++)
     {
       // skip packets that stayed in the queue for too long. They will be
       // actually removed from the queue by the next call to a non-const method
-      if (Simulator::Now () <= (*it)->GetTimeStamp () + m_maxDelay)
+      if (now <= (*it)->GetTimeStamp () + m_maxDelay)
         {
           return DoPeek (it);
         }
-      // signal the presence of expired packets
-      m_expiredPacketsPresent = true;
     }
   NS_LOG_DEBUG ("The queue is empty");
   return 0;
@@ -300,11 +209,12 @@
 {
   NS_LOG_FUNCTION (this << dest);
   ConstIterator it = (pos != EMPTY ? pos : begin ());
+  const Time now = Simulator::Now ();
   while (it != end ())
     {
       // skip packets that stayed in the queue for too long. They will be
       // actually removed from the queue by the next call to a non-const method
-      if (Simulator::Now () <= (*it)->GetTimeStamp () + m_maxDelay)
+      if (now <= (*it)->GetTimeStamp () + m_maxDelay)
         {
           if (((*it)->GetHeader ().IsData () || (*it)->GetHeader ().IsQosData ())
               && (*it)->GetDestinationAddress () == dest)
@@ -312,11 +222,6 @@
               return it;
             }
         }
-      else
-        {
-          // signal the presence of expired packets
-          m_expiredPacketsPresent = true;
-        }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
@@ -328,22 +233,18 @@
 {
   NS_LOG_FUNCTION (this << +tid);
   ConstIterator it = (pos != EMPTY ? pos : begin ());
+  const Time now = Simulator::Now ();
   while (it != end ())
     {
       // skip packets that stayed in the queue for too long. They will be
       // actually removed from the queue by the next call to a non-const method
-      if (Simulator::Now () <= (*it)->GetTimeStamp () + m_maxDelay)
+      if (now <= (*it)->GetTimeStamp () + m_maxDelay)
         {
           if ((*it)->GetHeader ().IsQosData () && (*it)->GetHeader ().GetQosTid () == tid)
             {
               return it;
             }
         }
-      else
-        {
-          // signal the presence of expired packets
-          m_expiredPacketsPresent = true;
-        }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
@@ -355,11 +256,12 @@
 {
   NS_LOG_FUNCTION (this << +tid << dest);
   ConstIterator it = (pos != EMPTY ? pos : begin ());
+  const Time now = Simulator::Now ();
   while (it != end ())
     {
       // skip packets that stayed in the queue for too long. They will be
       // actually removed from the queue by the next call to a non-const method
-      if (Simulator::Now () <= (*it)->GetTimeStamp () + m_maxDelay)
+      if (now <= (*it)->GetTimeStamp () + m_maxDelay)
         {
           if ((*it)->GetHeader ().IsQosData () && (*it)->GetDestinationAddress () == dest
               && (*it)->GetHeader ().GetQosTid () == tid)
@@ -367,11 +269,6 @@
               return it;
             }
         }
-      else
-        {
-          // signal the presence of expired packets
-          m_expiredPacketsPresent = true;
-        }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
@@ -383,11 +280,12 @@
 {
   NS_LOG_FUNCTION (this);
   ConstIterator it = (pos != EMPTY ? pos : begin ());
+  const Time now = Simulator::Now ();
   while (it != end ())
     {
       // skip packets that stayed in the queue for too long. They will be
       // actually removed from the queue by the next call to a non-const method
-      if (Simulator::Now () <= (*it)->GetTimeStamp () + m_maxDelay)
+      if (now <= (*it)->GetTimeStamp () + m_maxDelay)
         {
           if (!(*it)->GetHeader ().IsQosData () || !blockedPackets
               || !blockedPackets->IsBlocked ((*it)->GetHeader ().GetAddr1 (), (*it)->GetHeader ().GetQosTid ()))
@@ -395,11 +293,6 @@
               return it;
             }
         }
-      else
-        {
-          // signal the presence of expired packets
-          m_expiredPacketsPresent = true;
-        }
       it++;
     }
   NS_LOG_DEBUG ("The queue is empty");
@@ -411,9 +304,10 @@
 {
   NS_LOG_FUNCTION (this);
 
+  const Time now = Simulator::Now ();
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           return DoRemove (it);
         }
@@ -426,9 +320,11 @@
 WifiMacQueue::Remove (Ptr<const Packet> packet)
 {
   NS_LOG_FUNCTION (this << packet);
+
+  const Time now = Simulator::Now ();
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           if ((*it)->GetPacket () == packet)
             {
@@ -455,20 +351,19 @@
       return pos;
     }
 
+  const Time now = Simulator::Now ();
+
   // remove stale items queued before the given position
   ConstIterator it = begin ();
   while (it != end ())
     {
       if (it == pos)
         {
-          // reset the flag signaling the presence of expired packets before returning
-          m_expiredPacketsPresent = false;
-
           ConstIterator curr = pos++;
           DoRemove (curr);
           return pos;
         }
-      else if (!TtlExceeded (it))
+      else if (!TtlExceeded (it, now))
         {
           it++;
         }
@@ -483,10 +378,11 @@
   NS_LOG_FUNCTION (this << dest);
 
   uint32_t nPackets = 0;
+  const Time now = Simulator::Now ();
 
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           if ((*it)->GetHeader ().IsData () && (*it)->GetDestinationAddress () == dest)
             {
@@ -505,9 +401,11 @@
 {
   NS_LOG_FUNCTION (this << dest);
   uint32_t nPackets = 0;
+  const Time now = Simulator::Now ();
+
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           if ((*it)->GetHeader ().IsQosData () && (*it)->GetDestinationAddress () == dest
               && (*it)->GetHeader ().GetQosTid () == tid)
@@ -526,9 +424,11 @@
 WifiMacQueue::IsEmpty (void)
 {
   NS_LOG_FUNCTION (this);
+  const Time now = Simulator::Now ();
+
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           NS_LOG_DEBUG ("returns false");
           return false;
@@ -542,10 +442,12 @@
 WifiMacQueue::GetNPackets (void)
 {
   NS_LOG_FUNCTION (this);
+  const Time now = Simulator::Now ();
+
   // remove packets that stayed in the queue for too long
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           it++;
         }
@@ -557,10 +459,12 @@
 WifiMacQueue::GetNBytes (void)
 {
   NS_LOG_FUNCTION (this);
+  const Time now = Simulator::Now ();
+
   // remove packets that stayed in the queue for too long
   for (ConstIterator it = begin (); it != end (); )
     {
-      if (!TtlExceeded (it))
+      if (!TtlExceeded (it, now))
         {
           it++;
         }
@@ -612,7 +516,8 @@
           m_nQueuedBytes[addressTidPair] += item->GetSize ();
         }
       // set item's information about its position in the queue
-      item->m_queueIts = {{this, ret}};
+      item->m_queueAc = m_ac;
+      item->m_queueIt = ret;
       return true;
     }
   return false;
@@ -621,6 +526,14 @@
 Ptr<WifiMacQueueItem>
 WifiMacQueue::DoDequeue (ConstIterator pos)
 {
+  NS_LOG_FUNCTION (this);
+
+  if (TtlExceeded (pos, Simulator::Now ()))
+    {
+      NS_LOG_DEBUG ("Packet lifetime expired");
+      return nullptr;
+    }
+
   Ptr<WifiMacQueueItem> item = Queue<WifiMacQueueItem>::DoDequeue (pos);
 
   if (item != 0 && item->GetHeader ().IsQosData ())
@@ -636,8 +549,8 @@
 
   if (item != 0)
     {
-      NS_ASSERT (item->m_queueIts.size () == 1);
-      item->m_queueIts.clear ();
+      NS_ASSERT (item->IsQueued ());
+      item->m_queueAc = AC_UNDEF;
     }
 
   return item;
@@ -661,8 +574,8 @@
 
   if (item != 0)
     {
-      NS_ASSERT (item->m_queueIts.size () == 1);
-      item->m_queueIts.clear ();
+      NS_ASSERT (item->IsQueued ());
+      item->m_queueAc = AC_UNDEF;
     }
 
   return item;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-mac-queue.h ns-3.35/src/wifi/model/wifi-mac-queue.h
--- ns-3.34/src/wifi/model/wifi-mac-queue.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-mac-queue.h	2021-10-01 13:26:48.000000000 -0700
@@ -64,7 +64,14 @@
    * \return the object TypeId
    */
   static TypeId GetTypeId (void);
-  WifiMacQueue ();
+
+  /**
+   * Constructor
+   *
+   * \param ac the Access Category of the packets stored in this queue
+   */
+  WifiMacQueue (AcIndex ac = AC_UNDEF);
+
   ~WifiMacQueue ();
 
   /// drop policy
@@ -122,61 +129,11 @@
    */
   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>.
-   * This method removes the packet from the queue.
-   * It is typically used by ns3::Txop during the CF period.
-   *
-   * \param dest the given destination
+   * Dequeue the given MPDU if it is stored in this queue.
    *
-   * \return the packet
+   * \param mpdu the given MPDU
    */
-  Ptr<WifiMacQueueItem> DequeueByAddress (Mac48Address dest);
-  /**
-   * Search and return, if present in the queue, the first packet having the
-   * TID equal to <i>tid</i>.
-   * This method removes the packet from the queue.
-   *
-   * \param tid the given TID
-   *
-   * \return the packet
-   */
-  Ptr<WifiMacQueueItem> DequeueByTid (uint8_t tid);
-  /**
-   * Search and return, if present in the queue, the first packet having the
-   * address indicated by <i>type</i> equal to <i>addr</i>, and TID
-   * equal to <i>tid</i>. This method removes the packet from the queue.
-   * It is typically used by ns3::QosTxop in order to perform correct MSDU
-   * aggregation (A-MSDU).
-   *
-   * \param tid the given TID
-   * \param dest the given destination
-   *
-   * \return the packet
-   */
-  Ptr<WifiMacQueueItem> DequeueByTidAndAddress (uint8_t tid,
-                                                Mac48Address dest);
-  /**
-   * Return first available packet for transmission. A packet could be no available
-   * if it is a QoS packet with a TID and an address1 fields equal to <i>tid</i> and <i>addr</i>
-   * respectively that index a pending agreement in the BlockAckManager object.
-   * So that packet must not be transmitted until reception of an ADDBA response frame from station
-   * addressed by <i>addr</i>. This method removes the packet from queue.
-   *
-   * \param blockedPackets the destination address & TID pairs that are waiting for a BlockAck response
-   *
-   * \return the packet
-   */
-  Ptr<WifiMacQueueItem> DequeueFirstAvailable (const Ptr<QosBlockedDestinations> blockedPackets = nullptr);
-  /**
-   * Dequeue the item at position <i>pos</i> in the queue. Return a null
-   * pointer if the given iterator is invalid, the queue is empty or the
-   * lifetime of the item pointed to by the given iterator is expired.
-   *
-   * \param pos the position of the item to be dequeued
-   * \return the dequeued item, if any
-   */
-  Ptr<WifiMacQueueItem> Dequeue (WifiMacQueue::ConstIterator pos);
+  void DequeueIfQueued (Ptr<const WifiMacQueueItem> mpdu);
   /**
    * Peek the packet in the front of the queue. The packet is not removed.
    *
@@ -327,19 +284,21 @@
    */
   uint32_t GetNBytes (void);
 
-  static const ConstIterator EMPTY;         //!< Invalid iterator to signal an empty queue
-
-
-private:
   /**
    * Remove the item pointed to by the iterator <i>it</i> if it has been in the
    * queue for too long. If the item is removed, the iterator is updated to
    * point to the item that followed the erased one.
    *
    * \param it an iterator pointing to the item
+   * \param now a copy of Simulator::Now()
    * \return true if the item is removed, false otherwise
    */
-  bool TtlExceeded (ConstIterator &it);
+  inline bool TtlExceeded (ConstIterator &it, const Time& now);
+
+  static const ConstIterator EMPTY;         //!< Invalid iterator to signal an empty queue
+
+
+private:
   /**
    * Wrapper for the DoEnqueue method provided by the base class that additionally
    * sets the iterator field of the item and updates internal statistics, if
@@ -371,7 +330,7 @@
 
   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
+  AcIndex m_ac;                             //!< the access category
 
   /// Per (MAC address, TID) pair queued packets
   std::unordered_map<WifiAddressTidPair, uint32_t, WifiAddressTidHash> m_nQueuedPackets;
@@ -384,6 +343,25 @@
   NS_LOG_TEMPLATE_DECLARE;                  //!< redefinition of the log component
 };
 
+
+/**
+ * Implementation of inline functions
+ */
+
+bool
+WifiMacQueue::TtlExceeded (ConstIterator &it, const Time& now)
+{
+  if (now > (*it)->GetTimeStamp () + m_maxDelay)
+    {
+      NS_LOG_DEBUG ("Removing packet that stayed in the queue for too long (" <<
+                    now - (*it)->GetTimeStamp () << ")");
+      auto curr = it++;
+      m_traceExpired (DoRemove (curr));
+      return true;
+    }
+  return false;
+}
+
 } //namespace ns3
 
 #endif /* WIFI_MAC_QUEUE_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-mac-queue-item.cc ns-3.35/src/wifi/model/wifi-mac-queue-item.cc
--- ns-3.34/src/wifi/model/wifi-mac-queue-item.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-mac-queue-item.cc	2021-10-01 13:26:48.000000000 -0700
@@ -41,12 +41,14 @@
 WifiMacQueueItem::WifiMacQueueItem (Ptr<const Packet> p, const WifiMacHeader & header, Time tstamp)
   : m_packet (p),
     m_header (header),
-    m_tstamp (tstamp)
+    m_tstamp (tstamp),
+    m_queueAc (AC_UNDEF)
 {
   if (header.IsQosData () && header.IsQosAmsdu ())
     {
       m_msduList = MsduAggregator::Deaggregate (p->Copy ());
     }
+  m_inFlight = false;
 }
 
 WifiMacQueueItem::~WifiMacQueueItem ()
@@ -123,7 +125,6 @@
       // 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 ();
@@ -170,7 +171,6 @@
   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);
@@ -204,13 +204,39 @@
 bool
 WifiMacQueueItem::IsQueued (void) const
 {
-  return !m_queueIts.empty ();
+  return m_queueAc != AC_UNDEF;
 }
 
-const std::list<WifiMacQueueItem::QueueIteratorPair>&
-WifiMacQueueItem::GetQueueIteratorPairs (void) const
+AcIndex
+WifiMacQueueItem::GetQueueAc (void) const
 {
-  return m_queueIts;
+  NS_ASSERT (IsQueued ());
+  return m_queueAc;
+}
+
+WifiMacQueueItem::ConstIterator
+WifiMacQueueItem::GetQueueIterator (void) const
+{
+  NS_ASSERT (IsQueued ());
+  return m_queueIt;
+}
+
+void
+WifiMacQueueItem::SetInFlight (void)
+{
+  m_inFlight = true;
+}
+
+void
+WifiMacQueueItem::ResetInFlight (void)
+{
+  m_inFlight = false;
+}
+
+bool
+WifiMacQueueItem::IsInFlight (void) const
+{
+  return m_inFlight;
 }
 
 WifiMacQueueItem::DeaggregatedMsdusCI
@@ -250,7 +276,9 @@
           os << ", ack=BlockAck";
         }
     }
-  os << ", packet=" << m_packet;
+  os << ", packet=" << m_packet
+     << ", queued=" << IsQueued ()
+     << ", inflight=" << IsInFlight ();
 }
 
 std::ostream & operator << (std::ostream &os, const WifiMacQueueItem &item)
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-mac-queue-item.h ns-3.35/src/wifi/model/wifi-mac-queue-item.h
--- ns-3.34/src/wifi/model/wifi-mac-queue-item.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-mac-queue-item.h	2021-10-01 13:26:48.000000000 -0700
@@ -27,13 +27,13 @@
 #include "ns3/nstime.h"
 #include "wifi-mac-header.h"
 #include "amsdu-subframe-header.h"
+#include "qos-utils.h"
 #include <list>
 
 namespace ns3 {
 
 class QosBlockedDestinations;
 class Packet;
-class WifiMacQueue;
 
 /**
  * \ingroup wifi
@@ -142,12 +142,6 @@
 
   /// 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.
@@ -155,16 +149,20 @@
    * \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.
+   * Get the AC of the queue this item is stored into. Abort if this item
+   * is not stored in a queue.
+   *
+   * \return the AC of the queue this item is stored into
+   */
+  AcIndex GetQueueAc (void) const;
+  /**
+   * Get a const iterator pointing to the position of the MPDU in the queue. This
+   * method should not be called if the MPDU is not stored in a queue.
    *
-   * \return the list of iterators pointing to the positions of the items in the queue
+   * \return an iterator pointing to the position of the MPDU in the queue
    */
-  const std::list<QueueIteratorPair>& GetQueueIteratorPairs (void) const;
+  ConstIterator GetQueueIterator (void) const;
 
   /**
    * \brief Get the MAC protocol data unit (MPDU) corresponding to this item
@@ -175,6 +173,21 @@
   Ptr<Packet> GetProtocolDataUnit (void) const;
 
   /**
+   * Mark this MPDU as being in flight (only used if Block Ack agreement established).
+   */
+  void SetInFlight (void);
+  /**
+   * Mark this MPDU as not being in flight (only used if Block Ack agreement established).
+   */
+  void ResetInFlight (void);
+  /**
+   * Return true if this MPDU is in flight, false otherwise.
+   *
+   * \return true if this MPDU is in flight, false otherwise
+   */
+  bool IsInFlight (void) const;
+
+  /**
    * \brief Print the item contents.
    * \param os output stream in which the data should be printed.
    */
@@ -189,13 +202,15 @@
    */
   void DoAggregate (Ptr<const WifiMacQueueItem> msdu);
 
-  friend class WifiMacQueue;  // to set QueueIteratorPair information
+  friend class WifiMacQueue;  // to set queue AC and iterator 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
   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
+  ConstIterator m_queueIt;                      //!< Queue iterator pointing to this MPDU, if queued
+  AcIndex m_queueAc;                            //!< AC associated with the queue this MPDU is stored into
+  bool m_inFlight;                              //!< whether the MPDU is in flight
 };
 
 /**
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-phy.cc ns-3.35/src/wifi/model/wifi-phy.cc
--- ns-3.34/src/wifi/model/wifi-phy.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-phy.cc	2021-10-01 13:26:48.000000000 -0700
@@ -505,7 +505,7 @@
                      "Trace source indicating a packet "
                      "has begun transmitting over the channel medium",
                      MakeTraceSourceAccessor (&WifiPhy::m_phyTxBeginTrace),
-                     "ns3::Packet::TracedCallback")
+                     "ns3::WifiPhy::PhyTxBeginTracedCallback")
     .AddTraceSource ("PhyTxPsduBegin",
                      "Trace source indicating a PSDU "
                      "has begun transmitting over the channel medium",
@@ -526,7 +526,7 @@
                      "has begun being received from the channel medium "
                      "by the device",
                      MakeTraceSourceAccessor (&WifiPhy::m_phyRxBeginTrace),
-                     "ns3::Packet::TracedCallback")
+                     "ns3::WifiPhy::PhyRxBeginTracedCallback")
     .AddTraceSource ("PhyRxPayloadBegin",
                      "Trace source indicating the reception of the "
                      "payload of a PPDU has begun",
@@ -1636,11 +1636,14 @@
 void
 WifiPhy::NotifyTxBegin (WifiConstPsduMap psdus, double txPowerW)
 {
-  for (auto const& psdu : psdus)
+  if (!m_phyTxBeginTrace.IsEmpty ())
     {
-      for (auto& mpdu : *PeekPointer (psdu.second))
+      for (auto const& psdu : psdus)
         {
-          m_phyTxBeginTrace (mpdu->GetProtocolDataUnit (), txPowerW);
+          for (auto& mpdu : *PeekPointer (psdu.second))
+            {
+              m_phyTxBeginTrace (mpdu->GetProtocolDataUnit (), txPowerW);
+            }
         }
     }
 }
@@ -1648,11 +1651,14 @@
 void
 WifiPhy::NotifyTxEnd (WifiConstPsduMap psdus)
 {
-  for (auto const& psdu : psdus)
+  if (!m_phyTxEndTrace.IsEmpty ())
     {
-      for (auto& mpdu : *PeekPointer (psdu.second))
+      for (auto const& psdu : psdus)
         {
-          m_phyTxEndTrace (mpdu->GetProtocolDataUnit ());
+          for (auto& mpdu : *PeekPointer (psdu.second))
+            {
+              m_phyTxEndTrace (mpdu->GetProtocolDataUnit ());
+            }
         }
     }
 }
@@ -1660,16 +1666,19 @@
 void
 WifiPhy::NotifyTxDrop (Ptr<const WifiPsdu> psdu)
 {
-  for (auto& mpdu : *PeekPointer (psdu))
+  if (!m_phyTxDropTrace.IsEmpty ())
     {
-      m_phyTxDropTrace (mpdu->GetProtocolDataUnit ());
+      for (auto& mpdu : *PeekPointer (psdu))
+        {
+          m_phyTxDropTrace (mpdu->GetProtocolDataUnit ());
+        }
     }
 }
 
 void
-WifiPhy::NotifyRxBegin (Ptr<const WifiPsdu> psdu, RxPowerWattPerChannelBand rxPowersW)
+WifiPhy::NotifyRxBegin (Ptr<const WifiPsdu> psdu, const RxPowerWattPerChannelBand& rxPowersW)
 {
-  if (psdu)
+  if (psdu && !m_phyRxBeginTrace.IsEmpty ())
     {
       for (auto& mpdu : *PeekPointer (psdu))
         {
@@ -1681,7 +1690,7 @@
 void
 WifiPhy::NotifyRxEnd (Ptr<const WifiPsdu> psdu)
 {
-  if (psdu)
+  if (psdu && !m_phyRxEndTrace.IsEmpty ())
     {
       for (auto& mpdu : *PeekPointer (psdu))
         {
@@ -1693,7 +1702,7 @@
 void
 WifiPhy::NotifyRxDrop (Ptr<const WifiPsdu> psdu, WifiPhyRxfailureReason reason)
 {
-  if (psdu)
+  if (psdu && !m_phyRxDropTrace.IsEmpty ())
     {
       for (auto& mpdu : *PeekPointer (psdu))
         {
@@ -1714,22 +1723,28 @@
       aMpdu.mpduRefNumber = ++m_rxMpduReferenceNumber;
       size_t nMpdus = psdu->GetNMpdus ();
       NS_ASSERT_MSG (statusPerMpdu.size () == nMpdus, "Should have one reception status per MPDU");
-      aMpdu.type = (psdu->IsSingle ()) ? SINGLE_MPDU : FIRST_MPDU_IN_AGGREGATE;
-      for (size_t i = 0; i < nMpdus;)
+      if (!m_phyMonitorSniffRxTrace.IsEmpty ())
         {
-          if (statusPerMpdu.at (i)) //packet received without error, hand over to sniffer
+          aMpdu.type = (psdu->IsSingle ()) ? SINGLE_MPDU : FIRST_MPDU_IN_AGGREGATE;
+          for (size_t i = 0; i < nMpdus;)
             {
-              m_phyMonitorSniffRxTrace (psdu->GetAmpduSubframe (i), channelFreqMhz, txVector, aMpdu, signalNoise, staId);
+              if (statusPerMpdu.at (i)) //packet received without error, hand over to sniffer
+                {
+                  m_phyMonitorSniffRxTrace (psdu->GetAmpduSubframe (i), channelFreqMhz, txVector, aMpdu, signalNoise, staId);
+                }
+              ++i;
+              aMpdu.type = (i == (nMpdus - 1)) ? LAST_MPDU_IN_AGGREGATE : MIDDLE_MPDU_IN_AGGREGATE;
             }
-          ++i;
-          aMpdu.type = (i == (nMpdus - 1)) ? LAST_MPDU_IN_AGGREGATE : MIDDLE_MPDU_IN_AGGREGATE;
         }
     }
   else
     {
-      aMpdu.type = NORMAL_MPDU;
       NS_ASSERT_MSG (statusPerMpdu.size () == 1, "Should have one reception status for normal MPDU");
-      m_phyMonitorSniffRxTrace (psdu->GetPacket (), channelFreqMhz, txVector, aMpdu, signalNoise, staId);
+      if (!m_phyMonitorSniffRxTrace.IsEmpty ())
+        {
+          aMpdu.type = NORMAL_MPDU;
+          m_phyMonitorSniffRxTrace (psdu->GetPacket (), channelFreqMhz, txVector, aMpdu, signalNoise, staId);
+        }
     }
 }
 
@@ -1742,19 +1757,25 @@
       //Expand A-MPDU
       NS_ASSERT_MSG (txVector.IsAggregation (), "TxVector with aggregate flag expected here according to PSDU");
       aMpdu.mpduRefNumber = ++m_rxMpduReferenceNumber;
-      size_t nMpdus = psdu->GetNMpdus ();
-      aMpdu.type = (psdu->IsSingle ()) ? SINGLE_MPDU: FIRST_MPDU_IN_AGGREGATE;
-      for (size_t i = 0; i < nMpdus;)
+      if (!m_phyMonitorSniffTxTrace.IsEmpty ())
         {
-          m_phyMonitorSniffTxTrace (psdu->GetAmpduSubframe (i), channelFreqMhz, txVector, aMpdu, staId);
-          ++i;
-          aMpdu.type = (i == (nMpdus - 1)) ? LAST_MPDU_IN_AGGREGATE : MIDDLE_MPDU_IN_AGGREGATE;
+          size_t nMpdus = psdu->GetNMpdus ();
+          aMpdu.type = (psdu->IsSingle ()) ? SINGLE_MPDU: FIRST_MPDU_IN_AGGREGATE;
+          for (size_t i = 0; i < nMpdus;)
+            {
+              m_phyMonitorSniffTxTrace (psdu->GetAmpduSubframe (i), channelFreqMhz, txVector, aMpdu, staId);
+              ++i;
+              aMpdu.type = (i == (nMpdus - 1)) ? LAST_MPDU_IN_AGGREGATE : MIDDLE_MPDU_IN_AGGREGATE;
+            }
         }
     }
   else
     {
-      aMpdu.type = NORMAL_MPDU;
-      m_phyMonitorSniffTxTrace (psdu->GetPacket (), channelFreqMhz, txVector, aMpdu, staId);
+      if (!m_phyMonitorSniffTxTrace.IsEmpty ())
+        {
+          aMpdu.type = NORMAL_MPDU;
+          m_phyMonitorSniffTxTrace (psdu->GetPacket (), channelFreqMhz, txVector, aMpdu, staId);
+        }
     }
 }
 
@@ -1820,7 +1841,7 @@
     {
       AbortCurrentReception (RECEPTION_ABORTED_BY_TX);
       //that packet will be noise _after_ the transmission.
-      MaybeCcaBusyDuration (GetMeasurementChannelWidth (m_currentEvent != 0 ? m_currentEvent->GetPpdu () : nullptr));
+      SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (m_currentEvent != 0 ? m_currentEvent->GetPpdu () : nullptr));
     }
 
   for (auto & it : m_phyEntities)
@@ -1850,7 +1871,10 @@
 
   double txPowerW = DbmToW (GetTxPowerForTransmission (ppdu) + GetTxGain ());
   NotifyTxBegin (psdus, txPowerW);
-  m_phyTxPsduBeginTrace (psdus, txVector, txPowerW);
+  if (!m_phyTxPsduBeginTrace.IsEmpty ())
+    {
+      m_phyTxPsduBeginTrace (psdus, txVector, txPowerW);
+    }
   for (auto const& psdu : psdus)
     {
       NotifyMonitorSniffTx (psdu.second, GetFrequency (), txVector, psdu.first);
@@ -1891,7 +1915,7 @@
 }
 
 void
-WifiPhy::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration)
+WifiPhy::StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand& rxPowersW, Time rxDuration)
 {
   WifiModulationClass modulation = ppdu->GetTxVector ().GetModulationClass ();
   auto it = m_phyEntities.find (modulation);
@@ -1905,25 +1929,12 @@
       NS_LOG_DEBUG ("Unsupported modulation received (" << modulation << "), consider as noise");
       if (ppdu->GetTxDuration () > m_state->GetDelayUntilIdle ())
         {
-          MaybeCcaBusyDuration (GetMeasurementChannelWidth (nullptr));
+          m_interference.Add (ppdu, ppdu->GetTxVector (), rxDuration, rxPowersW);
+          SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (nullptr));
         }
     }
 }
 
-void
-WifiPhy::MaybeCcaBusyDuration (uint16_t 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
-  Time delayUntilCcaEnd = m_interference.GetEnergyDuration (m_ccaEdThresholdW, GetPrimaryBand (channelWidth));
-  if (!delayUntilCcaEnd.IsZero ())
-    {
-      m_state->SwitchMaybeToCcaBusy (delayUntilCcaEnd);
-    }
-}
-
 WifiSpectrumBand
 WifiPhy::ConvertHeRuSubcarriers (uint16_t bandWidth, uint16_t guardBandwidth,
                                  HeRu::SubcarrierRange range, uint8_t bandIndex) const
@@ -1951,7 +1962,7 @@
   m_interference.NotifyRxEnd (Simulator::Now ());
   m_currentEvent = 0;
   m_currentPreambleEvents.clear ();
-  MaybeCcaBusyDuration (GetMeasurementChannelWidth (event->GetPpdu ()));
+  SwitchMaybeToCcaBusy (GetMeasurementChannelWidth (event->GetPpdu ()));
 }
 
 void
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-phy-common.cc ns-3.35/src/wifi/model/wifi-phy-common.cc
--- ns-3.34/src/wifi/model/wifi-phy-common.cc	1969-12-31 16:00:00.000000000 -0800
+++ ns-3.35/src/wifi/model/wifi-phy-common.cc	2021-10-01 13:26:48.000000000 -0700
@@ -0,0 +1,175 @@
+/* -*- 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
+ *
+ * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
+ */
+
+#include "wifi-phy-common.h"
+#include "wifi-mode.h"
+#include "wifi-net-device.h"
+#include "ns3/ht-configuration.h"
+#include "ns3/he-configuration.h"
+
+namespace ns3 {
+
+uint16_t
+ConvertGuardIntervalToNanoSeconds (WifiMode mode, const Ptr<WifiNetDevice> device)
+{
+  uint16_t gi = 800;
+  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
+    {
+      Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
+      NS_ASSERT (heConfiguration); //If HE modulation is used, we should have a HE configuration attached
+      gi = static_cast<uint16_t> (heConfiguration->GetGuardInterval ().GetNanoSeconds ());
+    }
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
+      NS_ASSERT (htConfiguration); //If HT/VHT modulation is used, we should have a HT configuration attached
+      gi = htConfiguration->GetShortGuardIntervalSupported () ? 400 : 800;
+    }
+  return gi;
+}
+
+uint16_t
+ConvertGuardIntervalToNanoSeconds (WifiMode mode, bool htShortGuardInterval, Time heGuardInterval)
+{
+  uint16_t gi;
+  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
+    {
+      gi = static_cast<uint16_t> (heGuardInterval.GetNanoSeconds ());
+    }
+  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
+    {
+      gi = htShortGuardInterval ? 400 : 800;
+    }
+  else
+    {
+      gi = 800;
+    }
+  return gi;
+}
+
+uint16_t
+GetChannelWidthForTransmission (WifiMode mode, uint16_t maxSupportedChannelWidth)
+{
+  WifiModulationClass modulationClass = mode.GetModulationClass ();
+  if (maxSupportedChannelWidth > 20
+      && (modulationClass == WifiModulationClass::WIFI_MOD_CLASS_OFDM // all non-HT OFDM control and management frames
+          || modulationClass == WifiModulationClass::WIFI_MOD_CLASS_ERP_OFDM)) // special case of beacons at 2.4 GHz
+    {
+      return 20;
+    }
+  //at 2.4 GHz basic rate can be non-ERP DSSS
+  if (modulationClass == WifiModulationClass::WIFI_MOD_CLASS_DSSS
+      || modulationClass == WifiModulationClass::WIFI_MOD_CLASS_HR_DSSS)
+    {
+      return 22;
+    }
+  return maxSupportedChannelWidth;
+}
+
+WifiPreamble
+GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble)
+{
+  if (modulation == WIFI_MOD_CLASS_HE)
+    {
+      return WIFI_PREAMBLE_HE_SU;
+    }
+  else if (modulation == WIFI_MOD_CLASS_VHT)
+    {
+      return WIFI_PREAMBLE_VHT_SU;
+    }
+  else if (modulation == WIFI_MOD_CLASS_HT)
+    {
+      return WIFI_PREAMBLE_HT_MF; // HT_GF has been removed
+    }
+  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;
+    }
+  else
+    {
+      return WIFI_PREAMBLE_LONG;
+    }
+}
+
+bool
+IsAllowedControlAnswerModulationClass (WifiModulationClass modClassReq, WifiModulationClass modClassAnswer)
+{
+  switch (modClassReq)
+    {
+    case WIFI_MOD_CLASS_DSSS:
+      return (modClassAnswer == WIFI_MOD_CLASS_DSSS);
+    case WIFI_MOD_CLASS_HR_DSSS:
+      return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS);
+    case WIFI_MOD_CLASS_ERP_OFDM:
+      return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS || modClassAnswer == WIFI_MOD_CLASS_ERP_OFDM);
+    case WIFI_MOD_CLASS_OFDM:
+      return (modClassAnswer == WIFI_MOD_CLASS_OFDM);
+    case WIFI_MOD_CLASS_HT:
+    case WIFI_MOD_CLASS_VHT:
+    case WIFI_MOD_CLASS_HE:
+      return true;
+    default:
+      NS_FATAL_ERROR ("Modulation class not defined");
+      return false;
+    }
+}
+
+Time
+GetPpduMaxTime (WifiPreamble preamble)
+{
+  Time duration;
+
+  switch (preamble)
+    {
+      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;
+}
+
+bool
+IsMu (WifiPreamble preamble)
+{
+  return (IsDlMu (preamble) || IsUlMu (preamble));
+}
+
+bool
+IsDlMu (WifiPreamble preamble)
+{
+  return (preamble == WIFI_PREAMBLE_HE_MU);
+}
+
+bool
+IsUlMu (WifiPreamble preamble)
+{
+  return (preamble == WIFI_PREAMBLE_HE_TB);
+}
+
+} //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-phy-common.h ns-3.35/src/wifi/model/wifi-phy-common.h
--- ns-3.34/src/wifi/model/wifi-phy-common.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-phy-common.h	2021-10-01 13:26:48.000000000 -0700
@@ -25,6 +25,7 @@
 
 #include <ostream>
 #include "ns3/fatal-error.h"
+#include "ns3/ptr.h"
 
 /**
  * \file
@@ -39,6 +40,10 @@
 
 namespace ns3 {
 
+class WifiNetDevice;
+class WifiMode;
+class Time;
+
 /**
  * These constants define the various convolutional coding rates
  * used for the OFDM transmission modes in the IEEE 802.11
@@ -328,6 +333,95 @@
     }
 }
 
+/**
+ * Convert the guard interval to nanoseconds based on the WifiMode.
+ *
+ * \param mode the WifiMode
+ * \param device pointer to the WifiNetDevice object
+ *
+ * \return the guard interval duration in nanoseconds
+ */
+uint16_t ConvertGuardIntervalToNanoSeconds (WifiMode mode, const Ptr<WifiNetDevice> device);
+
+/**
+ * Convert the guard interval to nanoseconds based on the WifiMode.
+ *
+ * \param mode the WifiMode
+ * \param htShortGuardInterval whether HT/VHT short guard interval is enabled
+ * \param heGuardInterval the HE guard interval duration
+ *
+ * \return the guard interval duration in nanoseconds
+ */
+uint16_t ConvertGuardIntervalToNanoSeconds (WifiMode mode, bool htShortGuardInterval, Time heGuardInterval);
+
+/**
+ * Return the preamble to be used for the transmission.
+ *
+ * \param modulation the modulation selected for the transmission
+ * \param useShortPreamble whether short preamble should be used
+ *
+ * \return the preamble to be used for the transmission
+ */
+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
+ * non-HT modes with HT/VHT/HE capable stations (with default width above 20 MHz).
+ *
+ * \param mode selected WifiMode
+ * \param maxSupportedChannelWidth maximum channel width supported by the PHY layer
+ * \return channel width adapted to the selected mode
+ */
+uint16_t GetChannelWidthForTransmission (WifiMode mode, uint16_t maxSupportedChannelWidth);
+
+/**
+ * Return whether the modulation class of the selected mode for the
+ * control answer frame is allowed.
+ *
+ * \param modClassReq modulation class of the request frame
+ * \param modClassAnswer modulation class of the answer frame
+ *
+ * \return true if the modulation class of the selected mode for the
+ * control answer frame is allowed, false otherwise
+ */
+bool IsAllowedControlAnswerModulationClass (WifiModulationClass modClassReq, WifiModulationClass modClassAnswer);
+
+/**
+ * Get the maximum PPDU duration (see Section 10.14 of 802.11-2016) for
+ * the PHY layers defining the aPPDUMaxTime characteristic (HT, VHT and HE).
+ * Return zero otherwise.
+ *
+ * \param preamble the preamble type
+ *
+ * \return the maximum PPDU duration, if defined, and zero otherwise
+ */
+Time GetPpduMaxTime (WifiPreamble preamble);
+
+/**
+ * Return true if a preamble corresponds to a multi-user transmission.
+ *
+ * \param preamble the preamble
+ * \return true if the provided preamble corresponds to a multi-user transmission
+ */
+bool IsMu (WifiPreamble preamble);
+
+/**
+ * Return true if a preamble corresponds to a downlink multi-user transmission.
+ *
+ * \param preamble the preamble
+ * \return true if the provided preamble corresponds to a downlink multi-user transmission
+ */
+bool IsDlMu (WifiPreamble preamble);
+
+/**
+ * Return true if a preamble corresponds to a uplink multi-user transmission.
+ *
+ * \param preamble the preamble
+ * \return true if the provided preamble corresponds to a uplink multi-user transmission
+ */
+bool IsUlMu (WifiPreamble preamble);
+
 } //namespace ns3
 
 #endif /* WIFI_PHY_COMMON_H */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-phy.h ns-3.35/src/wifi/model/wifi-phy.h
--- ns-3.34/src/wifi/model/wifi-phy.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-phy.h	2021-10-01 13:26:48.000000000 -0700
@@ -105,7 +105,7 @@
    * \param rxPowersW the receive power in W per band
    * \param rxDuration the duration of the PPDU
    */
-  void StartReceivePreamble (Ptr<WifiPpdu> ppdu, RxPowerWattPerChannelBand rxPowersW, Time rxDuration);
+  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.
@@ -570,7 +570,7 @@
    * \param psdu the PSDU being transmitted
    * \param rxPowersW the receive power per channel band in Watts
    */
-  void NotifyRxBegin (Ptr<const WifiPsdu> psdu, RxPowerWattPerChannelBand rxPowersW);
+  void NotifyRxBegin (Ptr<const WifiPsdu> psdu, const RxPowerWattPerChannelBand& rxPowersW);
   /**
    * Public method used to fire a PhyRxEnd trace.
    * Implemented for encapsulation purposes.
@@ -679,6 +679,14 @@
                                             uint16_t staId);
 
   /**
+   * TracedCallback signature for Phy transmit events.
+   *
+   * \param packet the packet being transmitted
+   * \param txPowerW the transmit power in Watts
+   */
+  typedef void (* PhyTxBeginTracedCallback)(Ptr<const Packet> packet, double txPowerW);
+
+  /**
    * TracedCallback signature for PSDU transmit events.
    *
    * \param psduMap the PSDU map being transmitted
@@ -688,6 +696,14 @@
   typedef void (* PsduTxBeginCallback)(WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW);
 
   /**
+   * TracedCallback signature for PhyRxBegin trace source.
+   *
+   * \param packet the packet being received
+   * \param rxPowersW the receive power per channel band in Watts
+   */
+  typedef void (* PhyRxBeginTracedCallback) (Ptr<const Packet> packet, RxPowerWattPerChannelBand rxPowersW);
+
+  /**
    * TracedCallback signature for start of PSDU reception events.
    *
    * \param txVector the TXVECTOR decoded from the PHY header
@@ -1254,12 +1270,6 @@
   void AbortCurrentReception (WifiPhyRxfailureReason reason);
 
   /**
-   * Eventually switch to CCA busy
-   * \param channelWidth the channel width in MHz used for RSSI measurement
-   */
-  void MaybeCcaBusyDuration (uint16_t channelWidth);
-
-  /**
    * Get the PSDU addressed to that PHY in a PPDU (useful for MU PPDU).
    *
    * \param ppdu the PPDU to extract the PSDU from
@@ -1346,7 +1356,7 @@
    * ieee80211_input_monitor()
    *
    * \see class CallBackTraceSource
-   * \todo WifiTxVector and signalNoiseDbm should be be passed as
+   * \todo WifiTxVector and signalNoiseDbm should be passed as
    *       const references because of their sizes.
    */
   TracedCallback<Ptr<const Packet>, uint16_t /* frequency (MHz) */, WifiTxVector, MpduInfo, SignalNoiseDbm, uint16_t /* STA-ID*/> m_phyMonitorSniffRxTrace;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-phy-state-helper.cc ns-3.35/src/wifi/model/wifi-phy-state-helper.cc
--- ns-3.34/src/wifi/model/wifi-phy-state-helper.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-phy-state-helper.cc	2021-10-01 13:26:48.000000000 -0700
@@ -358,9 +358,13 @@
 WifiPhyStateHelper::SwitchToTx (Time txDuration, WifiConstPsduMap psdus, double txPowerDbm, WifiTxVector txVector)
 {
   NS_LOG_FUNCTION (this << txDuration << psdus << txPowerDbm << txVector);
-  for (auto const& psdu : psdus)
+  if (!m_txTrace.IsEmpty ())
     {
-      m_txTrace (psdu.second->GetPacket (), txVector.GetMode (psdu.first), txVector.GetPreambleType (), txVector.GetTxPowerLevel ());
+      for (auto const& psdu : psdus)
+        {
+          m_txTrace (psdu.second->GetPacket (), txVector.GetMode (psdu.first),
+                     txVector.GetPreambleType (), txVector.GetTxPowerLevel ());
+        }
     }
   Time now = Simulator::Now ();
   switch (GetState ())
@@ -483,7 +487,11 @@
   NS_ASSERT (statusPerMpdu.size () != 0);
   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 ());
+  if (!m_rxOkTrace.IsEmpty ())
+    {
+      m_rxOkTrace (psdu->GetPacket (), rxSignalInfo.snr, txVector.GetMode (staId),
+                   txVector.GetPreambleType ());
+    }
   NotifyRxEndOk ();
   DoSwitchFromRx ();
   if (!m_rxOkCallback.IsNull ())
@@ -498,7 +506,10 @@
   NS_LOG_FUNCTION (this << *psdu << snr);
   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);
+  if (!m_rxErrorTrace.IsEmpty ())
+    {
+      m_rxErrorTrace (psdu->GetPacket (), snr);
+    }
   NotifyRxEndError ();
   DoSwitchFromRx ();
   if (!m_rxErrorCallback.IsNull ())
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-remote-station-manager.cc ns-3.35/src/wifi/model/wifi-remote-station-manager.cc
--- ns-3.34/src/wifi/model/wifi-remote-station-manager.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-remote-station-manager.cc	2021-10-01 13:26:48.000000000 -0700
@@ -493,6 +493,18 @@
 }
 
 uint16_t
+WifiRemoteStationManager::GetAssociationId (Mac48Address remoteAddress) const
+{
+  WifiRemoteStationState* state;
+  if (!remoteAddress.IsGroup ()
+      && (state = LookupState (remoteAddress))->m_state == WifiRemoteStationState::GOT_ASSOC_TX_OK)
+    {
+      return state->m_aid;
+    }
+  return SU_STA_ID;
+}
+
+uint16_t
 WifiRemoteStationManager::GetStaId (Mac48Address address, const WifiTxVector& txVector) const
 {
   NS_LOG_FUNCTION (this << address << txVector);
@@ -503,7 +515,7 @@
     {
       if (m_wifiMac->GetTypeOfStation () == AP)
         {
-          staId = StaticCast<ApWifiMac> (m_wifiMac)->GetAssociationId (address);
+          staId = GetAssociationId (address);
         }
       else if (m_wifiMac->GetTypeOfStation () == STA)
         {
@@ -1206,20 +1218,12 @@
 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 ());
+  auto stationIt = m_stations.find (address);
+  NS_ASSERT_MSG (stationIt != m_stations.end(), "Address: " << address << " not found");
+  auto station = stationIt->second;
+  auto rssi = station->m_rssiAndUpdateTimePair.first;
+  auto ts = station->m_rssiAndUpdateTimePair.second;
+  NS_ASSERT_MSG (ts.IsStrictlyPositive(), "address: " << address << " ts:" << ts);
   return rssi;
 }
 
@@ -1227,17 +1231,18 @@
 WifiRemoteStationManager::LookupState (Mac48Address address) const
 {
   NS_LOG_FUNCTION (this << address);
-  for (StationStates::const_iterator i = m_states.begin (); i != m_states.end (); i++)
+  auto stateIt = m_states.find (address);
+
+  if (stateIt != m_states.end ())
     {
-      if ((*i)->m_address == address)
-        {
-          NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning existing state");
-          return (*i);
-        }
+      NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning existing state");
+      return stateIt->second;
     }
+
   WifiRemoteStationState *state = new WifiRemoteStationState ();
   state->m_state = WifiRemoteStationState::BRAND_NEW;
   state->m_address = address;
+  state->m_aid = 0;
   state->m_operationalRateSet.push_back (GetDefaultMode ());
   state->m_operationalMcsSet.push_back (GetDefaultMcs ());
   state->m_dsssSupported = false;
@@ -1251,7 +1256,7 @@
   state->m_ness = 0;
   state->m_aggregation = false;
   state->m_qosSupported = false;
-  const_cast<WifiRemoteStationManager *> (this)->m_states.push_back (state);
+  const_cast<WifiRemoteStationManager *> (this)->m_states.insert ({address, state});
   NS_LOG_DEBUG ("WifiRemoteStationManager::LookupState returning new state");
   return state;
 }
@@ -1260,23 +1265,30 @@
 WifiRemoteStationManager::Lookup (Mac48Address address) const
 {
   NS_LOG_FUNCTION (this << address);
-  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++)
+  auto stationIt = m_stations.find (address);
+
+  if (stationIt != m_stations.end ())
     {
-      if ((*i)->m_state->m_address == address)
-        {
-          return (*i);
-        }
+      return stationIt->second;
     }
+
   WifiRemoteStationState *state = LookupState (address);
 
   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);
+  const_cast<WifiRemoteStationManager *> (this)->m_stations.insert ({address, station});
   return station;
 }
 
 void
+WifiRemoteStationManager::SetAssociationId (Mac48Address remoteAddress, uint16_t aid)
+{
+  NS_LOG_FUNCTION (this << remoteAddress << aid);
+  LookupState (remoteAddress)->m_aid = aid;
+}
+
+void
 WifiRemoteStationManager::SetQosSupport (Mac48Address from, bool qosSupported)
 {
   NS_LOG_FUNCTION (this << from << qosSupported);
@@ -1458,14 +1470,14 @@
 WifiRemoteStationManager::Reset (void)
 {
   NS_LOG_FUNCTION (this);
-  for (StationStates::const_iterator i = m_states.begin (); i != m_states.end (); i++)
+  for (auto& state : m_states)
     {
-      delete (*i);
+      delete (state.second);
     }
   m_states.clear ();
-  for (Stations::const_iterator i = m_stations.begin (); i != m_stations.end (); i++)
+  for (auto& state: m_stations)
     {
-      delete (*i);
+      delete (state.second);
     }
   m_stations.clear ();
   m_bssBasicRateSet.clear ();
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-remote-station-manager.h ns-3.35/src/wifi/model/wifi-remote-station-manager.h
--- ns-3.34/src/wifi/model/wifi-remote-station-manager.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-remote-station-manager.h	2021-10-01 13:26:48.000000000 -0700
@@ -22,6 +22,7 @@
 #define WIFI_REMOTE_STATION_MANAGER_H
 
 #include <array>
+#include <unordered_map>
 #include "ns3/traced-callback.h"
 #include "ns3/object.h"
 #include "ns3/data-rate.h"
@@ -92,6 +93,8 @@
   WifiModeList m_operationalRateSet; //!< operational rate set
   WifiModeList m_operationalMcsSet;  //!< operational MCS set
   Mac48Address m_address;            //!< Mac48Address of the remote station
+  uint16_t m_aid;                    /**< AID of the remote station (unused if this object
+                                          is installed on a non-AP 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
@@ -134,13 +137,13 @@
   };
 
   /**
-   * A vector of WifiRemoteStations
+   * A map of WifiRemoteStations with Mac48Address as key
    */
-  typedef std::vector <WifiRemoteStation *> Stations;
+  using Stations = std::unordered_map <Mac48Address, WifiRemoteStation *, WifiAddressHash>;
   /**
-   * A vector of WifiRemoteStationStates
+   * A map of WifiRemoteStationStates with Mac48Address as key
    */
-  typedef std::vector <WifiRemoteStationState *> StationStates;
+  using StationStates = std::unordered_map <Mac48Address, WifiRemoteStationState *, WifiAddressHash>;
 
   /**
    * Set up PHY associated with this device since it is the object that
@@ -201,6 +204,13 @@
   void SetFragmentationThreshold (uint32_t threshold);
 
   /**
+   * Record the AID of a remote station. Should only be called by APs.
+   *
+   * \param remoteAddress the MAC address of the remote station
+   * \param aid the Association ID
+   */
+  void SetAssociationId (Mac48Address remoteAddress, uint16_t aid);
+  /**
    * Records QoS support of the remote station.
    *
    * \param from the address of the station being recorded
@@ -422,6 +432,13 @@
    */
   bool GetQosSupported (Mac48Address address) const;
   /**
+   * Get the AID of a remote station. Should only be called by APs.
+   *
+   * \param remoteAddress the MAC address of the remote station
+   * \return the Association ID if the station is associated, SU_STA_ID otherwise
+   */
+  uint16_t GetAssociationId (Mac48Address remoteAddress) const;
+  /**
    * Add a given Modulation and Coding Scheme (MCS) index to
    * the set of basic MCS.
    *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-standards.h ns-3.35/src/wifi/model/wifi-standards.h
--- ns-3.34/src/wifi/model/wifi-standards.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-standards.h	2021-10-01 13:26:48.000000000 -0700
@@ -39,20 +39,8 @@
   WIFI_PHY_STANDARD_80211b,
   /** ERP-OFDM PHY (Clause 19, Section 19.5) */
   WIFI_PHY_STANDARD_80211g,
-  /** OFDM PHY for the 5 GHz band (Clause 17 with 10 MHz channel bandwidth) */
-  /** this value is NS_DEPRECATED_3_32 */
-  WIFI_PHY_STANDARD_80211_10MHZ,
-  /** OFDM PHY for the 5 GHz band (Clause 17 with 5 MHz channel bandwidth) */
-  /** this value is NS_DEPRECATED_3_32 */
-  WIFI_PHY_STANDARD_80211_5MHZ,
   /** OFDM PHY (Clause 17 - amendment for 10 MHz and 5 MHz channels) */
   WIFI_PHY_STANDARD_80211p,
-  /** HT PHY for the 2.4 GHz band (clause 20) */
-  /** this value is NS_DEPRECATED_3_32 */
-  WIFI_PHY_STANDARD_80211n_2_4GHZ,
-  /** HT PHY for the 5 GHz band (clause 20) */
-  /** this value is NS_DEPRECATED_3_32 */
-  WIFI_PHY_STANDARD_80211n_5GHZ,
   /** HT PHY  (clause 20) */
   WIFI_PHY_STANDARD_80211n,
   /** VHT PHY (clause 22) */
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-tx-vector.cc ns-3.35/src/wifi/model/wifi-tx-vector.cc
--- ns-3.34/src/wifi/model/wifi-tx-vector.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-tx-vector.cc	2021-10-01 13:26:48.000000000 -0700
@@ -20,6 +20,7 @@
  */
 
 #include "wifi-tx-vector.h"
+#include "wifi-phy-common.h"
 #include "ns3/abort.h"
 
 namespace ns3 {
@@ -116,7 +117,7 @@
     }
   if (IsMu ())
     {
-      NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU (" << staId << ")");
+      NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU (" << staId << ")");
       NS_ASSERT (m_muUserInfos.find (staId) != m_muUserInfos.end ());
       return m_muUserInfos.at (staId).mcs;
     }
@@ -172,7 +173,7 @@
 {
   if (IsMu ())
     {
-      NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for HE MU (" << staId << ")");
+      NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU (" << staId << ")");
       NS_ASSERT (m_muUserInfos.find (staId) != m_muUserInfos.end ());
       return m_muUserInfos.at (staId).nss;
     }
@@ -231,8 +232,8 @@
 void
 WifiTxVector::SetMode (WifiMode mode, uint16_t staId)
 {
-  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");
+  NS_ABORT_MSG_IF (!IsMu (), "Not a MU transmission");
+  NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU");
   m_muUserInfos[staId].mcs = mode;
   m_modeInitialized = true;
 }
@@ -276,8 +277,8 @@
 void
 WifiTxVector::SetNss (uint8_t nss, uint16_t staId)
 {
-  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");
+  NS_ABORT_MSG_IF (!IsMu (), "Not a MU transmission");
+  NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU");
   m_muUserInfos[staId].nss = nss;
 }
 
@@ -368,26 +369,26 @@
 bool
 WifiTxVector::IsMu (void) const
 {
-  return (m_preamble == WIFI_PREAMBLE_HE_MU || m_preamble == WIFI_PREAMBLE_HE_TB);
+  return ns3::IsMu (m_preamble);
 }
 
 bool
 WifiTxVector::IsDlMu (void) const
 {
-  return ((m_preamble == WIFI_PREAMBLE_VHT_MU) || (m_preamble == WIFI_PREAMBLE_HE_MU));
+  return ns3::IsDlMu (m_preamble);
 }
 
 bool
 WifiTxVector::IsUlMu (void) const
 {
-  return (m_preamble == WIFI_PREAMBLE_HE_TB);
+  return ns3::IsUlMu (m_preamble);
 }
 
 HeRu::RuSpec
 WifiTxVector::GetRu (uint16_t staId) const
 {
   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");
+  NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU");
   return m_muUserInfos.at (staId).ru;
 }
 
@@ -395,7 +396,7 @@
 WifiTxVector::SetRu (HeRu::RuSpec ru, uint16_t staId)
 {
   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");
+  NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU");
   m_muUserInfos[staId].ru = ru;
 }
 
@@ -410,8 +411,8 @@
 WifiTxVector::SetHeMuUserInfo (uint16_t staId, HeMuUserInfo userInfo)
 {
   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");
+  NS_ABORT_MSG_IF (staId > 2048, "STA-ID should be correctly set for MU");
+  NS_ABORT_MSG_IF (userInfo.mcs.GetModulationClass () < WIFI_MOD_CLASS_HE, "Only HE (or newer) modes authorized for MU");
   m_muUserInfos[staId] = userInfo;
   m_modeInitialized = true;
 }
@@ -433,7 +434,6 @@
 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)
@@ -518,7 +518,7 @@
     {
       os << " BSS color: " << +v.GetBssColor ();
     }
-  if (v.GetPreambleType () == WIFI_PREAMBLE_HE_TB)
+  if (v.IsUlMu ())
     {
       os << " Length: " << v.GetLength ();
     }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-tx-vector.h ns-3.35/src/wifi/model/wifi-tx-vector.h
--- ns-3.34/src/wifi/model/wifi-tx-vector.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-tx-vector.h	2021-10-01 13:26:48.000000000 -0700
@@ -121,22 +121,22 @@
    * MU PPDU, return the transmission mode (MCS) selected for the transmission
    * to the station identified by the given STA-ID.
    *
-   * \param staId the station ID for HE MU
+   * \param staId the station ID for MU
    * \returns the selected payload transmission mode
    */
   WifiMode GetMode (uint16_t staId = SU_STA_ID) const;
   /**
-  * Sets the selected payload transmission mode
-  *
-  * \param mode the payload WifiMode
-  */
+   * Sets the selected payload transmission mode
+   *
+   * \param mode the payload WifiMode
+   */
   void SetMode (WifiMode mode);
   /**
-  * Sets the selected payload transmission mode for a given STA ID (for HE MU only)
-  *
-  * \param mode
-   * \param staId the station ID for HE MU
-  */
+   * Sets the selected payload transmission mode for a given STA ID (for MU only)
+   *
+   * \param mode
+   * \param staId the station ID for MU
+   */
   void SetMode (WifiMode mode, uint16_t staId);
 
   /**
@@ -202,12 +202,12 @@
    * return the number of spatial streams for the transmission to the station
    * identified by the given STA-ID.
    *
-   * \param staId the station ID for HE MU
+   * \param staId the station ID for MU
    * \returns the number of spatial streams
    */
   uint8_t GetNss (uint16_t staId = SU_STA_ID) const;
   /**
-   * \returns the maximum number of Nss (namely if HE MU)
+   * \returns the maximum number of Nss (namely if MU)
    */
   uint8_t GetNssMax (void) const;
   /**
@@ -217,10 +217,10 @@
    */
   void SetNss (uint8_t nss);
   /**
-   * Sets the number of Nss for HE MU
+   * Sets the number of Nss for MU
    *
    * \param nss the number of spatial streams
-   * \param staId the station ID for HE MU
+   * \param staId the station ID for MU
    */
   void SetNss (uint8_t nss, uint16_t staId);
   /**
@@ -319,7 +319,7 @@
   bool IsUlMu (void) const;
   /**
     * Get the RU specification for the STA-ID.
-    * This is applicable only for HE MU.
+    * This is applicable only for MU.
     *
     * \param staId the station ID
     * \return the RU specification for the STA-ID
@@ -327,7 +327,7 @@
    HeRu::RuSpec GetRu (uint16_t staId) const;
    /**
     * Set the RU specification for the STA-ID.
-    * This is applicable only for HE MU.
+    * This is applicable only for MU.
     *
     * \param ru the RU specification
     * \param staId the station ID
@@ -365,7 +365,7 @@
    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
+    * This is applicable only for 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.
     *
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-utils.cc ns-3.35/src/wifi/model/wifi-utils.cc
--- ns-3.34/src/wifi/model/wifi-utils.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-utils.cc	2021-10-01 13:26:48.000000000 -0700
@@ -18,16 +18,12 @@
  * Author: Sébastien Deronne <sebastien.deronne@gmail.com>
  */
 
-#include "ns3/nstime.h"
+#include <cmath>
+#include "ns3/packet.h"
 #include "wifi-utils.h"
 #include "ctrl-headers.h"
 #include "wifi-mac-header.h"
 #include "wifi-mac-trailer.h"
-#include "wifi-net-device.h"
-#include "ns3/ht-configuration.h"
-#include "ns3/he-configuration.h"
-#include "wifi-mode.h"
-#include "ampdu-subframe-header.h"
 
 namespace ns3 {
 
@@ -55,111 +51,6 @@
   return 10.0 * std::log10 (ratio);
 }
 
-uint16_t
-ConvertGuardIntervalToNanoSeconds (WifiMode mode, const Ptr<WifiNetDevice> device)
-{
-  uint16_t gi = 800;
-  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
-    {
-      Ptr<HeConfiguration> heConfiguration = device->GetHeConfiguration ();
-      NS_ASSERT (heConfiguration); //If HE modulation is used, we should have a HE configuration attached
-      gi = static_cast<uint16_t> (heConfiguration->GetGuardInterval ().GetNanoSeconds ());
-    }
-  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-    {
-      Ptr<HtConfiguration> htConfiguration = device->GetHtConfiguration ();
-      NS_ASSERT (htConfiguration); //If HT/VHT modulation is used, we should have a HT configuration attached
-      gi = htConfiguration->GetShortGuardIntervalSupported () ? 400 : 800;
-    }
-  return gi;
-}
-
-uint16_t
-ConvertGuardIntervalToNanoSeconds (WifiMode mode, bool htShortGuardInterval, Time heGuardInterval)
-{
-  uint16_t gi;
-  if (mode.GetModulationClass () == WIFI_MOD_CLASS_HE)
-    {
-      gi = static_cast<uint16_t> (heGuardInterval.GetNanoSeconds ());
-    }
-  else if (mode.GetModulationClass () == WIFI_MOD_CLASS_HT || mode.GetModulationClass () == WIFI_MOD_CLASS_VHT)
-    {
-      gi = htShortGuardInterval ? 400 : 800;
-    }
-  else
-    {
-      gi = 800;
-    }
-  return gi;
-}
-
-uint16_t
-GetChannelWidthForTransmission (WifiMode mode, uint16_t maxSupportedChannelWidth)
-{
-  WifiModulationClass modulationClass = mode.GetModulationClass ();
-  if (maxSupportedChannelWidth > 20
-      && (modulationClass == WifiModulationClass::WIFI_MOD_CLASS_OFDM // all non-HT OFDM control and management frames
-          || modulationClass == WifiModulationClass::WIFI_MOD_CLASS_ERP_OFDM)) // special case of beacons at 2.4 GHz
-    {
-      return 20;
-    }
-  //at 2.4 GHz basic rate can be non-ERP DSSS
-  if (modulationClass == WifiModulationClass::WIFI_MOD_CLASS_DSSS
-      || modulationClass == WifiModulationClass::WIFI_MOD_CLASS_HR_DSSS)
-    {
-      return 22;
-    }
-  return maxSupportedChannelWidth;
-}
-
-WifiPreamble
-GetPreambleForTransmission (WifiModulationClass modulation, bool useShortPreamble)
-{
-  if (modulation == WIFI_MOD_CLASS_HE)
-    {
-      return WIFI_PREAMBLE_HE_SU;
-    }
-  else if (modulation == WIFI_MOD_CLASS_VHT)
-    {
-      return WIFI_PREAMBLE_VHT_SU;
-    }
-  else if (modulation == WIFI_MOD_CLASS_HT)
-    {
-      return WIFI_PREAMBLE_HT_MF; // HT_GF has been removed
-    }
-  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;
-    }
-  else
-    {
-      return WIFI_PREAMBLE_LONG;
-    }
-}
-
-bool
-IsAllowedControlAnswerModulationClass (WifiModulationClass modClassReq, WifiModulationClass modClassAnswer)
-{
-  switch (modClassReq)
-    {
-    case WIFI_MOD_CLASS_DSSS:
-      return (modClassAnswer == WIFI_MOD_CLASS_DSSS);
-    case WIFI_MOD_CLASS_HR_DSSS:
-      return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS);
-    case WIFI_MOD_CLASS_ERP_OFDM:
-      return (modClassAnswer == WIFI_MOD_CLASS_DSSS || modClassAnswer == WIFI_MOD_CLASS_HR_DSSS || modClassAnswer == WIFI_MOD_CLASS_ERP_OFDM);
-    case WIFI_MOD_CLASS_OFDM:
-      return (modClassAnswer == WIFI_MOD_CLASS_OFDM);
-    case WIFI_MOD_CLASS_HT:
-    case WIFI_MOD_CLASS_VHT:
-    case WIFI_MOD_CLASS_HE:
-      return true;
-    default:
-      NS_FATAL_ERROR ("Modulation class not defined");
-      return false;
-    }
-}
-
 uint32_t
 GetAckSize (void)
 {
@@ -250,45 +141,4 @@
   return size;
 }
 
-Time
-GetPpduMaxTime (WifiPreamble preamble)
-{
-  Time duration;
-
-  switch (preamble)
-    {
-      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;
-}
-
-bool
-IsHt (WifiPreamble preamble)
-{
-   return (preamble == WIFI_PREAMBLE_HT_MF);
-}
-
-bool
-IsVht (WifiPreamble preamble)
-{
-   return (preamble == WIFI_PREAMBLE_VHT_SU || preamble == WIFI_PREAMBLE_VHT_MU);
-}
-
-bool
-IsHe (WifiPreamble preamble)
-{
-   return (preamble == WIFI_PREAMBLE_HE_SU || preamble == WIFI_PREAMBLE_HE_MU || preamble == WIFI_PREAMBLE_HE_TB || preamble == WIFI_PREAMBLE_HE_ER_SU);
-}
-
 } //namespace ns3
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/wifi-utils.h ns-3.35/src/wifi/model/wifi-utils.h
--- ns-3.34/src/wifi/model/wifi-utils.h	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/wifi-utils.h	2021-10-01 13:26:48.000000000 -0700
@@ -21,18 +21,14 @@
 #ifndef WIFI_UTILS_H
 #define WIFI_UTILS_H
 
-#include "block-ack-type.h"
-#include "wifi-phy-common.h"
-#include "wifi-mode.h"
 #include <list>
+#include "ns3/ptr.h"
+#include "block-ack-type.h"
 
 namespace ns3 {
 
-class WifiNetDevice;
 class WifiMacHeader;
-class WifiMode;
 class Packet;
-class Time;
 
 /**
  * Convert from dBm to Watts.
@@ -67,55 +63,6 @@
  */
 double RatioToDb (double ratio);
 /**
- * Convert the guard interval to nanoseconds based on the WifiMode.
- *
- * \param mode the WifiMode
- * \param device pointer to the WifiNetDevice object
- *
- * \return the guard interval duration in nanoseconds
- */
-uint16_t ConvertGuardIntervalToNanoSeconds (WifiMode mode, const Ptr<WifiNetDevice> device);
-/**
- * Convert the guard interval to nanoseconds based on the WifiMode.
- *
- * \param mode the WifiMode
- * \param htShortGuardInterval whether HT/VHT short guard interval is enabled
- * \param heGuardInterval the HE guard interval duration
- *
- * \return the guard interval duration in nanoseconds
- */
-uint16_t ConvertGuardIntervalToNanoSeconds (WifiMode mode, bool htShortGuardInterval, Time heGuardInterval);
-/**
- * Return the preamble to be used for the transmission.
- *
- * \param modulation the modulation selected for the transmission
- * \param useShortPreamble whether short preamble should be used
- *
- * \return the preamble to be used for the transmission
- */
-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
- * non-HT modes with HT/VHT/HE capable stations (with default width above 20 MHz).
- *
- * \param mode selected WifiMode
- * \param maxSupportedChannelWidth maximum channel width supported by the PHY layer
- * \return channel width adapted to the selected mode
- */
-uint16_t GetChannelWidthForTransmission (WifiMode mode, uint16_t maxSupportedChannelWidth);
-/**
- * Return whether the modulation class of the selected mode for the
- * control answer frame is allowed.
- *
- * \param modClassReq modulation class of the request frame
- * \param modClassAnswer modulation class of the answer frame
- *
- * \return true if the modulation class of the selected mode for the
- * control answer frame is allowed, false otherwise
- */
-bool IsAllowedControlAnswerModulationClass (WifiModulationClass modClassReq, WifiModulationClass modClassAnswer);
-/**
  * Return the total Ack size (including FCS trailer).
  *
  * \return the total Ack size in bytes
@@ -179,44 +126,6 @@
  * \return the total packet size
  */
 uint32_t GetSize (Ptr<const Packet> packet, const WifiMacHeader *hdr, bool isAmpdu);
-/**
- * Get the maximum PPDU duration (see Section 10.14 of 802.11-2016) for
- * the PHY layers defining the aPPDUMaxTime characteristic (HT, VHT and HE).
- * Return zero otherwise.
- *
- * \param preamble the preamble type
- *
- * \return the maximum PPDU duration, if defined, and zero otherwise
- */
-Time GetPpduMaxTime (WifiPreamble preamble);
-
-/**
- * Return whether the preamble is a HT format preamble.
- *
- * \param preamble the preamble type
- *
- * \return true if the preamble is a HT format preamble,
- *         false otherwise
- */
-bool IsHt (WifiPreamble preamble);
-/**
- * Return whether the preamble is a VHT format preamble.
- *
- * \param preamble the preamble type
- *
- * \return true if the preamble is a VHT format preamble,
- *         false otherwise
- */
-bool IsVht (WifiPreamble preamble);
-/**
- * Return whether the preamble is a HE format preamble.
- *
- * \param preamble the preamble type
- *
- * \return true if the preamble is a HE format preamble,
- *         false otherwise
- */
-bool IsHe (WifiPreamble preamble);
 
 /// Size of the space of sequence numbers
 const uint16_t SEQNO_SPACE_SIZE = 4096;
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/model/yans-error-rate-model.cc ns-3.35/src/wifi/model/yans-error-rate-model.cc
--- ns-3.34/src/wifi/model/yans-error-rate-model.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/model/yans-error-rate-model.cc	2021-10-01 13:26:48.000000000 -0700
@@ -182,11 +182,7 @@
 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 << 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)
+  if (mode.GetModulationClass () >= WIFI_MOD_CLASS_ERP_OFDM)
     {
       uint64_t phyRate;
       if ((txVector.IsMu () && (staId == SU_STA_ID)) || (mode != txVector.GetMode ()))
@@ -356,6 +352,33 @@
                                    5,  // dFree
                                    8,  // adFree
                                    31  // adFreePlusOne
+                                   );
+            }
+        }
+      else if (mode.GetConstellationSize () == 4096)
+        {
+          if (mode.GetCodeRate () == WIFI_CODE_RATE_5_6)
+            {
+              return GetFecQamBer (snr,
+                                   nbits,
+                                   txVector.GetChannelWidth () * 1000000, // signal spread
+                                   mode.GetPhyRate (txVector), //PHY rate
+                                   4096, // m
+                                   4,  // dFree
+                                   14,  // adFree
+                                   69  // adFreePlusOne
+                                   );
+            }
+          else
+            {
+              return GetFecQamBer (snr,
+                                   nbits,
+                                   txVector.GetChannelWidth () * 1000000, // signal spread
+                                   mode.GetPhyRate (txVector), //PHY rate
+                                   4096, // m
+                                   5,  // dFree
+                                   8,  // adFree
+                                   31  // adFreePlusOne
                                    );
             }
         }
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/test/channel-access-manager-test.cc ns-3.35/src/wifi/test/channel-access-manager-test.cc
--- ns-3.34/src/wifi/test/channel-access-manager-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/test/channel-access-manager-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -62,8 +62,6 @@
   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
@@ -165,10 +163,17 @@
  *
  * \brief Frame Exchange Manager Stub
  */
+template <typename TxopType>
 class FrameExchangeManagerStub : public FrameExchangeManager
 {
 public:
-  FrameExchangeManagerStub ()
+  /**
+   * Constructor
+   *
+   * \param test the test channel access manager
+   */
+  FrameExchangeManagerStub (ChannelAccessManagerTest<TxopType> *test)
+    : m_test (test)
   {
   }
   /**
@@ -183,6 +188,14 @@
     dcf->NotifyChannelAccessed ();
     return true;
   }
+  /// \copydoc ns3::FrameExchangeManager::NotifyInternalCollision
+  void NotifyInternalCollision (Ptr<Txop> txop) override
+  {
+    m_test->NotifyInternalCollision (DynamicCast<TxopTest<TxopType>> (txop));
+  }
+
+private:
+  ChannelAccessManagerTest<TxopType> *m_test; //!< the test DCF/EDCA manager
 };
 
 /**
@@ -205,9 +218,9 @@
   void NotifyAccessGranted (uint32_t i);
   /**
    * Notify internal collision function
-   * \param i the index of the Txop
+   * \param state the Txop
    */
-  void NotifyInternalCollision (uint32_t i);
+  void NotifyInternalCollision (Ptr<TxopTest<TxopType>> state);
   /**
    * Generate backoff function
    * \param i the index of the Txop
@@ -365,7 +378,7 @@
 
   typedef std::vector<Ptr<TxopTest<TxopType>>> TxopTests; //!< the TXOP tests typedef
 
-  Ptr<FrameExchangeManagerStub> m_feManager; //!< the Frame Exchange Manager stubbed
+  Ptr<FrameExchangeManagerStub<TxopType>> 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
@@ -403,13 +416,6 @@
 
 template <typename TxopType>
 void
-TxopTest<TxopType>::NotifyInternalCollision (void)
-{
-  m_test->NotifyInternalCollision (m_i);
-}
-
-template <typename TxopType>
-void
 TxopTest<TxopType>::GenerateBackoff (void)
 {
   m_test->GenerateBackoff (m_i);
@@ -474,9 +480,8 @@
 
 template <typename TxopType>
 void
-ChannelAccessManagerTest<TxopType>::NotifyInternalCollision (uint32_t i)
+ChannelAccessManagerTest<TxopType>::NotifyInternalCollision (Ptr<TxopTest<TxopType>> state)
 {
-  Ptr<TxopTest<TxopType>> state = m_txop[i];
   NS_TEST_EXPECT_MSG_EQ (state->m_expectedInternalCollision.empty (), false, "Have expected internal collisions");
   if (!state->m_expectedInternalCollision.empty ())
     {
@@ -558,7 +563,7 @@
 ChannelAccessManagerTest<TxopType>::StartTest (uint64_t slotTime, uint64_t sifs, uint64_t eifsNoDifsNoSifs, uint32_t ackTimeoutValue)
 {
   m_ChannelAccessManager = CreateObject<ChannelAccessManagerStub> ();
-  m_feManager = CreateObject<FrameExchangeManagerStub> ();
+  m_feManager = CreateObject<FrameExchangeManagerStub<TxopType>> (this);
   m_ChannelAccessManager->SetupFrameExchangeManager (m_feManager);
   m_ChannelAccessManager->SetSlot (MicroSeconds (slotTime));
   m_ChannelAccessManager->SetSifs (MicroSeconds (sifs));
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/test/wifi-aggregation-test.cc ns-3.35/src/wifi/test/wifi-aggregation-test.cc
--- ns-3.34/src/wifi/test/wifi-aggregation-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/test/wifi-aggregation-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -192,7 +192,7 @@
   Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  WifiMacQueueItem::QueueIteratorPair queueIt;
+  WifiMacQueueItem::ConstIterator queueIt;
   Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (),
                                                                   true, queueIt);
 
@@ -276,7 +276,7 @@
   peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   txParams.Clear ();
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  queueIt = {nullptr, WifiMacQueue::EMPTY};  // reset queueIt
+  queueIt = WifiMacQueue::EMPTY;  // reset queueIt
   item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
 
   mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
@@ -288,7 +288,7 @@
   peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   txParams.Clear ();
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  queueIt = {nullptr, WifiMacQueue::EMPTY};  // reset queueIt
+  queueIt = WifiMacQueue::EMPTY;  // reset queueIt
   item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (), true, queueIt);
 
   mpduList = mpduAggregator->GetNextAmpdu (item, txParams, Time::Min (), queueIt);
@@ -424,7 +424,7 @@
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
   htFem->TryAddMpdu (peeked, txParams, Time::Min ());
-  WifiMacQueueItem::QueueIteratorPair queueIt;
+  WifiMacQueueItem::ConstIterator queueIt;
   Ptr<WifiMacQueueItem> item = msduAggregator->GetNextAmsdu (peeked, txParams, Time::Min (), queueIt);
 
   bool result = (item != 0);
@@ -451,7 +451,7 @@
 
   NS_TEST_EXPECT_MSG_EQ ((item == 0), true, "A-MSDU aggregation did not fail");
 
-  htFem->DequeueMpdu (*peeked->GetQueueIteratorPairs ().front ().it);
+  htFem->DequeueMpdu (*peeked->GetQueueIterator ());
 
   NS_TEST_EXPECT_MSG_EQ (m_mac->GetBEQueue ()->GetWifiMacQueue ()->GetNPackets (), 0, "queue should be empty");
 
@@ -502,7 +502,7 @@
 
   // Compute the first MPDU to be aggregated in an A-MPDU. It must contain an A-MSDU
   // aggregating two MSDUs
-  queueIt = {nullptr, WifiMacQueue::EMPTY};  // reset queueIt
+  queueIt = 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");
@@ -684,7 +684,7 @@
   Ptr<const WifiMacQueueItem> peeked = m_mac->GetBEQueue ()->PeekNextMpdu ();
   WifiTxParameters txParams;
   txParams.m_txVector = m_mac->GetWifiRemoteStationManager ()->GetDataTxVector (peeked->GetHeader ());
-  WifiMacQueueItem::QueueIteratorPair queueIt;
+  WifiMacQueueItem::ConstIterator queueIt;
   Ptr<WifiMacQueueItem> item = m_mac->GetBEQueue ()->GetNextMpdu (peeked, txParams, Time::Min (),
                                                                   true, queueIt);
   
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/test/wifi-mac-ofdma-test.cc ns-3.35/src/wifi/test/wifi-mac-ofdma-test.cc
--- ns-3.34/src/wifi/test/wifi-mac-ofdma-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/test/wifi-mac-ofdma-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -205,7 +205,7 @@
               return SU_TX;
             }
 
-          WifiMacQueueItem::QueueIteratorPair queueIt;
+          WifiMacQueueItem::ConstIterator queueIt;
           Ptr<WifiMacQueueItem> mpdu = m_apMac->GetQosTxop (AC_BE)->GetNextMpdu (peeked, m_txParams,
                                                                                  m_availableTime,
                                                                                  m_initialFrame, queueIt);
@@ -326,15 +326,28 @@
 {
 public:
   /**
+   * MU EDCA Parameter Set
+   */
+  struct MuEdcaParameterSet
+  {
+    uint8_t muAifsn;   //!< MU AIFS (0 to disable EDCA)
+    uint16_t muCwMin;  //!< MU CW min
+    uint16_t muCwMax;  //!< MU CW max
+    uint8_t muTimer;   //!< MU EDCA Timer in units of 8192 microseconds (0 not to use MU EDCA)
+  };
+
+  /**
    * 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
+   * \param muEdcaParameterSet the MU EDCA Parameter Set
    */
   OfdmaAckSequenceTest (uint16_t width, WifiAcknowledgment::Method dlType, uint32_t maxAmpduSize,
-                        uint16_t txopLimit, uint16_t nPktsPerSta);
+                        uint16_t txopLimit, uint16_t nPktsPerSta,
+                        MuEdcaParameterSet muEdcaParameterSet);
   virtual ~OfdmaAckSequenceTest ();
 
   /**
@@ -345,6 +358,13 @@
    */
   void L7Receive (std::string context, Ptr<const Packet> p, const Address &addr);
   /**
+   * Function to trace CW value used by the given station after the MU exchange
+   * \param staIndex the index of the given station
+   * \param oldCw the previous Contention Window value
+   * \param cw the current Contention Window value
+   */
+  void TraceCw (uint32_t staIndex, uint32_t oldCw, uint32_t cw);
+  /**
    * Callback invoked when FrameExchangeManager passes PSDUs to the PHY
    * \param context the context
    * \param psduMap the PSDU map
@@ -374,18 +394,24 @@
 
   uint16_t m_nStations;                      ///< number of stations
   NetDeviceContainer m_staDevices;           ///< stations' devices
+  Ptr<NetDevice> m_apDevice;                 ///< AP's device
   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
+  MuEdcaParameterSet m_muEdcaParameterSet;   ///< MU EDCA Parameter Set
   uint16_t m_received;                       ///< number of packets received by the stations
+  uint16_t m_flushed;                        ///< number of DL packets flushed after DL MU PPDU
+  Time m_edcaDisabledStartTime;              ///< time when disabling EDCA started
+  std::vector<uint32_t> m_cwValues;          ///< CW used by stations after MU exchange
 };
 
 OfdmaAckSequenceTest::OfdmaAckSequenceTest (uint16_t width, WifiAcknowledgment::Method dlType,
                                             uint32_t maxAmpduSize, uint16_t txopLimit,
-                                            uint16_t nPktsPerSta)
+                                            uint16_t nPktsPerSta,
+                                            MuEdcaParameterSet muEdcaParameterSet)
   : TestCase ("Check correct operation of DL OFDMA acknowledgment sequences"),
     m_nStations (4),
     m_channelWidth (width),
@@ -393,7 +419,11 @@
     m_maxAmpduSize (maxAmpduSize),
     m_txopLimit (txopLimit),
     m_nPktsPerSta (nPktsPerSta),
-    m_received (0)
+    m_muEdcaParameterSet (muEdcaParameterSet),
+    m_received (0),
+    m_flushed (0),
+    m_edcaDisabledStartTime (Seconds (0)),
+    m_cwValues (std::vector<uint32_t> (m_nStations, 2))  // 2 is an invalid CW value
 {
 }
 
@@ -411,6 +441,17 @@
 }
 
 void
+OfdmaAckSequenceTest::TraceCw (uint32_t staIndex, uint32_t oldCw, uint32_t cw)
+{
+  if (m_cwValues.at (staIndex) == 2)
+    {
+      // store the first CW used after MU exchange (the last one may be used after
+      // the MU EDCA timer expired)
+      m_cwValues[staIndex] = cw;
+    }
+}
+
+void
 OfdmaAckSequenceTest::Transmit (std::string context, WifiConstPsduMap psduMap, WifiTxVector txVector, double txPowerW)
 {
   // skip beacon frames and frames transmitted before 1.5s (association
@@ -423,18 +464,35 @@
                             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 ());
+      for (const auto& psduPair : psduMap)
+        {
+          NS_LOG_INFO ("Sending " << psduPair.second->GetHeader (0).GetTypeString ()
+                        << " #MPDUs " << psduPair.second->GetNMpdus ()
+                        << " txDuration " << txDuration
+                        << " duration/ID " << psduPair.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 ())
+  // Flush the MAC queue of the AP after sending a DL MU PPDU (no need for
+  // further transmissions)
+  if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_MU)
+    {
+      auto dev = DynamicCast<WifiNetDevice> (m_apDevice);
+      Ptr<WifiMacQueue> queue = DynamicCast<RegularWifiMac> (dev->GetMac ())->GetQosTxop (AC_BE)->GetWifiMacQueue ();
+      m_flushed = 0;
+      for (auto it = queue->begin (); it != queue->end (); )
+        {
+          auto tmp = it++;
+          if (!(*tmp)->IsInFlight ())
+            {
+              queue->Remove (tmp);
+              m_flushed++;
+            }
+        }
+    }
+  else if (txVector.GetPreambleType () == WIFI_PREAMBLE_HE_TB
+           && psduMap.begin ()->second->GetHeader (0).HasData ())
     {
       Mac48Address sender = psduMap.begin ()->second->GetAddr2 ();
 
@@ -444,11 +502,42 @@
 
           if (dev->GetAddress () == sender)
             {
-              DynamicCast<RegularWifiMac> (dev->GetMac ())->GetQosTxop (AC_BE)->GetWifiMacQueue ()->Flush ();
+              Ptr<QosTxop> qosTxop = DynamicCast<RegularWifiMac> (dev->GetMac ())->GetQosTxop (AC_BE);
+
+              if (m_muEdcaParameterSet.muTimer > 0 && m_muEdcaParameterSet.muAifsn > 0)
+                {
+                  // stations use worse access parameters, trace CW. MU AIFSN must be large
+                  // enough to avoid collisions between stations trying to transmit using EDCA
+                  // right after the UL MU transmission and the AP trying to send a DL MU PPDU
+                  qosTxop->TraceConnectWithoutContext ("CwTrace",
+                                                       MakeCallback (&OfdmaAckSequenceTest::TraceCw,
+                                                                     this).Bind (i));
+                }
+              else
+                {
+                  // there is no "protection" against collisions from stations, hence flush
+                  // their MAC queues after sending an HE TB PPDU containing QoS data frames,
+                  // so that the AP can send a DL MU PPDU
+                  qosTxop->GetWifiMacQueue ()->Flush ();
+                }
               break;
             }
         }
     }
+  else if (!txVector.IsMu () && psduMap.begin ()->second->GetHeader (0).IsBlockAck ()
+           && psduMap.begin ()->second->GetHeader (0).GetAddr2 () == m_apDevice->GetAddress ()
+           && m_muEdcaParameterSet.muTimer > 0 && m_muEdcaParameterSet.muAifsn == 0)
+    {
+      CtrlBAckResponseHeader blockAck;
+      psduMap.begin ()->second->GetPayload (0)->PeekHeader (blockAck);
+
+      if (blockAck.IsMultiSta ())
+        {
+          // AP is transmitting a multi-STA BlockAck and stations have to disable EDCA,
+          // record the starting time
+          m_edcaDisabledStartTime = Simulator::Now () + m_txPsdus.back ().endTx - m_txPsdus.back ().startTx;
+        }
+    }
 }
 
 void
@@ -706,6 +795,8 @@
     }
   NS_TEST_EXPECT_MSG_GT (navEnd, m_txPsdus[11].endTx, "Duration/ID of the DL MU PPDU cannot be zero");
 
+  std::size_t nTxPsdus = 0;
+
   if (m_dlMuAckType == WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE)
     {
       /*
@@ -804,6 +895,7 @@
           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");
         }
+      nTxPsdus = 19;
     }
   else if (m_dlMuAckType == WifiAcknowledgment::DL_MU_TF_MU_BAR)
     {
@@ -886,6 +978,8 @@
       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");
+
+      nTxPsdus = 17;
     }
   else if (m_dlMuAckType == WifiAcknowledgment::DL_MU_AGGREGATE_TF)
     {
@@ -955,9 +1049,42 @@
       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");
+
+      nTxPsdus = 16;
+    }
+
+  NS_TEST_EXPECT_MSG_EQ (m_received, m_nPktsPerSta * m_nStations - m_flushed,
+                         "Not all DL packets have been received");
+
+  if (m_muEdcaParameterSet.muTimer > 0 && m_muEdcaParameterSet.muAifsn == 0)
+    {
+      // EDCA disabled, find the first PSDU transmitted by a station not in an
+      // HE TB PPDU and check that it was not transmitted before the MU EDCA
+      // timer expired
+      for (std::size_t i = nTxPsdus; i < m_txPsdus.size (); ++i)
+        {
+          if (m_txPsdus[i].psduMap.size () == 1
+              && m_txPsdus[i].psduMap.begin ()->second->GetHeader (0).GetAddr2 () != m_apDevice->GetAddress ()
+              && !m_txPsdus[i].txVector.IsUlMu ())
+            {
+              NS_TEST_EXPECT_MSG_GT_OR_EQ (m_txPsdus[i].startTx.GetMicroSeconds (),
+                                           m_edcaDisabledStartTime.GetMicroSeconds ()
+                                           + m_muEdcaParameterSet.muTimer * 8192,
+                                           "A station transmitted before the MU EDCA timer expired");
+              break;
+            }
+        }
+    }
+  else if (m_muEdcaParameterSet.muTimer > 0 && m_muEdcaParameterSet.muAifsn > 0)
+    {
+      // stations used worse access parameters after successful UL MU transmission
+      for (const auto& cwValue : m_cwValues)
+        {
+          NS_TEST_EXPECT_MSG_EQ ((cwValue == 2 || cwValue >= m_muEdcaParameterSet.muCwMin),
+                                 true, "A station did not set the correct MU CW min");
+        }
     }
 
-  NS_TEST_EXPECT_MSG_EQ (m_received, m_nPktsPerSta * m_nStations, "Not all packets have been received");
   m_txPsdus.clear ();
 }
 
@@ -1003,6 +1130,25 @@
     }
   phy.Set ("ChannelWidth", UintegerValue (m_channelWidth));
 
+  Config::SetDefault ("ns3::HeConfiguration::MuBeAifsn",
+                      UintegerValue (m_muEdcaParameterSet.muAifsn));
+  Config::SetDefault ("ns3::HeConfiguration::MuBeCwMin",
+                      UintegerValue (m_muEdcaParameterSet.muCwMin));
+  Config::SetDefault ("ns3::HeConfiguration::MuBeCwMax",
+                      UintegerValue (m_muEdcaParameterSet.muCwMax));
+  Config::SetDefault ("ns3::HeConfiguration::BeMuEdcaTimer",
+                      TimeValue (MicroSeconds (8192 * m_muEdcaParameterSet.muTimer)));
+  // MU EDCA timers must be either all null or all non-null
+  Config::SetDefault ("ns3::HeConfiguration::BkMuEdcaTimer",
+                      TimeValue (MicroSeconds (8192 * m_muEdcaParameterSet.muTimer)));
+  Config::SetDefault ("ns3::HeConfiguration::ViMuEdcaTimer",
+                      TimeValue (MicroSeconds (8192 * m_muEdcaParameterSet.muTimer)));
+  Config::SetDefault ("ns3::HeConfiguration::VoMuEdcaTimer",
+                      TimeValue (MicroSeconds (8192 * m_muEdcaParameterSet.muTimer)));
+
+  // increase MSDU lifetime so that it does not expire before the MU EDCA timer ends
+  Config::SetDefault ("ns3::WifiMacQueue::MaxDelay", TimeValue (Seconds (2)));
+
   WifiHelper wifi;
   wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
   wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
@@ -1027,11 +1173,10 @@
   mac.SetMultiUserScheduler ("ns3::TestMultiUserScheduler");
   mac.SetAckManager ("ns3::WifiDefaultAckManager", "DlMuAckSequenceType", EnumValue (m_dlMuAckType));
 
-  NetDeviceContainer apDevices;
-  apDevices = wifi.Install (phy, mac, wifiApNode);
+  m_apDevice = wifi.Install (phy, mac, wifiApNode).Get (0);
 
   // Assign fixed streams to random variables in use
-  streamNumber += wifi.AssignStreams (apDevices, streamNumber);
+  streamNumber += wifi.AssignStreams (NetDeviceContainer (m_apDevice), streamNumber);
   streamNumber += wifi.AssignStreams (m_staDevices, streamNumber);
 
   MobilityHelper mobility;
@@ -1056,7 +1201,7 @@
       dev = DynamicCast<WifiNetDevice> (m_staDevices.Get (i));
       dev->GetMac ()->SetAttribute ("BE_MaxAmpduSize", UintegerValue (m_maxAmpduSize));
     }
-  dev = DynamicCast<WifiNetDevice> (apDevices.Get (0));
+  dev = DynamicCast<WifiNetDevice> (m_apDevice);
   dev->GetMac ()->SetAttribute ("BE_MaxAmpduSize", UintegerValue (m_maxAmpduSize));
 
   PointerValue ptr;
@@ -1073,7 +1218,7 @@
   for (uint16_t i = 0; i < m_nStations; i++)
     {
       PacketSocketAddress socket;
-      socket.SetSingleDevice (apDevices.Get (0)->GetIfIndex ());
+      socket.SetSingleDevice (m_apDevice->GetIfIndex ());
       socket.SetPhysicalAddress (m_staDevices.Get (i)->GetAddress ());
       socket.SetProtocol (1);
 
@@ -1111,7 +1256,7 @@
     {
       PacketSocketAddress socket;
       socket.SetSingleDevice (m_staDevices.Get (i)->GetIfIndex ());
-      socket.SetPhysicalAddress (apDevices.Get (0)->GetAddress ());
+      socket.SetPhysicalAddress (m_apDevice->GetAddress ());
       socket.SetProtocol (1);
 
       // the first client application generates two packets in order
@@ -1174,12 +1319,19 @@
 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);
+  using MuEdcaParams = std::initializer_list<OfdmaAckSequenceTest::MuEdcaParameterSet>;
+
+  for (auto& muEdcaParameterSet : MuEdcaParams {{0, 0, 0, 0}         /* no MU EDCA */,
+                                                {0, 127, 2047, 100}  /* EDCA disabled */,
+                                                {10, 127, 2047, 100} /* worse parameters */})
+    {
+      AddTestCase (new OfdmaAckSequenceTest (20, WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE, 10000, 5440, 15, muEdcaParameterSet), TestCase::QUICK);
+      AddTestCase (new OfdmaAckSequenceTest (20, WifiAcknowledgment::DL_MU_AGGREGATE_TF, 10000, 5440, 15, muEdcaParameterSet), TestCase::QUICK);
+      AddTestCase (new OfdmaAckSequenceTest (20, WifiAcknowledgment::DL_MU_TF_MU_BAR, 10000, 5440, 15, muEdcaParameterSet), TestCase::QUICK);
+      AddTestCase (new OfdmaAckSequenceTest (40, WifiAcknowledgment::DL_MU_BAR_BA_SEQUENCE, 10000, 0, 15, muEdcaParameterSet), TestCase::QUICK);
+      AddTestCase (new OfdmaAckSequenceTest (40, WifiAcknowledgment::DL_MU_AGGREGATE_TF, 10000, 0, 15, muEdcaParameterSet), TestCase::QUICK);
+      AddTestCase (new OfdmaAckSequenceTest (40, WifiAcknowledgment::DL_MU_TF_MU_BAR, 10000, 0, 15, muEdcaParameterSet), TestCase::QUICK);
+    }
 }
 
 static WifiMacOfdmaTestSuite g_wifiMacOfdmaTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/test/wifi-mac-queue-test.cc ns-3.35/src/wifi/test/wifi-mac-queue-test.cc
--- ns-3.34/src/wifi/test/wifi-mac-queue-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/test/wifi-mac-queue-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -53,7 +53,7 @@
 void
 WifiMacQueueDropOldestTest::DoRun ()
 {
-  auto wifiMacQueue = CreateObject<WifiMacQueue> ();
+  auto wifiMacQueue = CreateObject<WifiMacQueue> (AC_BE);
   wifiMacQueue->SetMaxSize (QueueSize ("5p"));
   wifiMacQueue->SetAttribute ("DropPolicy", EnumValue (WifiMacQueue::DROP_OLDEST));
 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/test/wifi-phy-ofdma-test.cc ns-3.35/src/wifi/test/wifi-phy-ofdma-test.cc
--- ns-3.34/src/wifi/test/wifi-phy-ofdma-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/test/wifi-phy-ofdma-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -3232,7 +3232,7 @@
   void RunOne (bool setupBa);
 
   /**
-   * Replace the AP's MacLow callback on its PHY's ReceiveOkCallback
+   * Replace the AP's callback on its PHY's ReceiveOkCallback
    * by the ReceiveOkCallbackAtAp method.
    */
   void ReplaceReceiveOkCallbackOfAp (void);
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/test/wifi-phy-reception-test.cc ns-3.35/src/wifi/test/wifi-phy-reception-test.cc
--- ns-3.34/src/wifi/test/wifi-phy-reception-test.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/test/wifi-phy-reception-test.cc	2021-10-01 13:26:48.000000000 -0700
@@ -19,11 +19,20 @@
  */
 
 #include "ns3/log.h"
+#include "ns3/mobility-helper.h"
+#include "ns3/multi-model-spectrum-channel.h"
+#include "ns3/config.h"
+#include "ns3/ap-wifi-mac.h"
+#include "ns3/packet-socket-address.h"
+#include "ns3/packet-socket-client.h"
+#include "ns3/packet-socket-helper.h"
+#include "ns3/packet-socket-server.h"
 #include "ns3/test.h"
 #include "ns3/double.h"
 #include "ns3/pointer.h"
 #include "ns3/rng-seed-manager.h"
 #include "ns3/spectrum-wifi-helper.h"
+#include "ns3/wifi-net-device.h"
 #include "ns3/wifi-spectrum-value-helper.h"
 #include "ns3/spectrum-wifi-phy.h"
 #include "ns3/nist-error-rate-model.h"
@@ -2345,6 +2354,206 @@
  * \ingroup wifi-test
  * \ingroup tests
  *
+ * \brief Unsupported Modulation Reception Test
+ * This test creates a mixed network, in which an HE STA and a VHT
+ * STA are associated to an HE AP and send uplink traffic. In the
+ * simulated deployment the VHT STA's backoff will expire while the
+ * HE STA is sending a packet, and the VHT STA will access the
+ * channel anyway. This happens because the HE STA is using an HeMcs
+ * that the VHT STA is not able to demodulate: the VHT STA will
+ * correctly stop listening to the HE packet, but it will not update
+ * its InterferenceHelper with the HE packet. Later on, this leads to
+ * the STA wrongly assuming the medium is available when its back-off
+ * expires in the middle of the HE packet. We detect that this is
+ * happening by looking at the reason why the AP is failing to decode
+ * the preamble from the VHT STA's transmission: if the reason is
+ * that it's in RX already, the test fails. The test is based on
+ * wifi-txop-test.cc.
+*/
+class TestUnsupportedModulationReception : public TestCase
+{
+public:
+  /**
+   * Constructor
+   */
+  TestUnsupportedModulationReception ();
+  virtual ~TestUnsupportedModulationReception ();
+
+  /**
+   * Callback invoked when PHY drops an incoming packet
+   * \param context the context
+   * \param packet the packet that was dropped
+   * \param reason the reason the packet was dropped
+   */
+  void Dropped (std::string context, Ptr<const Packet> packet, WifiPhyRxfailureReason reason);
+  /**
+   * Check correctness of transmitted frames
+   */
+  void CheckResults (void);
+
+private:
+  void DoRun (void) override;
+  uint16_t m_dropped; ///< number of packets dropped by the AP because it was already receiving
+};
+
+TestUnsupportedModulationReception::TestUnsupportedModulationReception ()
+  : TestCase ("Check correct behavior when a STA is receiving a transmission using an unsupported modulation"),
+    m_dropped (0)
+{
+}
+
+TestUnsupportedModulationReception::~TestUnsupportedModulationReception ()
+{
+}
+
+void
+TestUnsupportedModulationReception::Dropped (std::string context, Ptr<const Packet> packet,
+                                             WifiPhyRxfailureReason reason)
+{
+  // Print if the test is executed through test-runner
+  if (reason == RXING)
+    {
+      std::cout << "Dropped a packet because already receiving" << std::endl;
+      m_dropped++;
+    }
+}
+
+void
+TestUnsupportedModulationReception::DoRun (void)
+{
+  uint16_t m_nStations = 2; ///< number of stations
+  NetDeviceContainer m_staDevices; ///< container for stations' NetDevices
+  NetDeviceContainer m_apDevices; ///< container for AP's NetDevice
+
+  // RngSeedManager::SetSeed (1);
+  // RngSeedManager::SetRun (40);
+  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.SetChannel (spectrumChannel);
+
+  Config::SetDefault ("ns3::WifiRemoteStationManager::RtsCtsThreshold", UintegerValue (65535));
+
+  WifiHelper wifi;
+  wifi.SetRemoteStationManager ("ns3::IdealWifiManager");
+
+  WifiMacHelper mac;
+  mac.SetType ("ns3::StaWifiMac", "QosSupported", BooleanValue (true), "Ssid",
+               SsidValue (Ssid ("non-existent-ssid")));
+
+  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  m_staDevices.Add (wifi.Install (phy, mac, wifiStaNodes.Get (0)));
+  wifi.SetStandard (WIFI_STANDARD_80211ac);
+  m_staDevices.Add (wifi.Install (phy, mac, wifiStaNodes.Get (1)));
+
+  wifi.SetStandard (WIFI_STANDARD_80211ax_5GHZ);
+  mac.SetType ("ns3::ApWifiMac", "QosSupported", BooleanValue (true), "Ssid",
+               SsidValue (Ssid ("wifi-backoff-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-backoff-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);
+
+  PacketSocketHelper packetSocket;
+  packetSocket.Install (wifiApNode);
+  packetSocket.Install (wifiStaNodes);
+
+  // UL Traffic
+  for (uint16_t i = 0; i < m_nStations; i++)
+    {
+      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 (200));
+      client->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      client->SetRemote (socket);
+      wifiStaNodes.Get (i)->AddApplication (client);
+      client->SetStartTime (MicroSeconds (400000));
+      client->SetStopTime (Seconds (1.0));
+      Ptr<PacketSocketClient> legacyStaClient = CreateObject<PacketSocketClient> ();
+      legacyStaClient->SetAttribute ("PacketSize", UintegerValue (1500));
+      legacyStaClient->SetAttribute ("MaxPackets", UintegerValue (200));
+      legacyStaClient->SetAttribute ("Interval", TimeValue (MicroSeconds (0)));
+      legacyStaClient->SetRemote (socket);
+      wifiStaNodes.Get (i)->AddApplication (legacyStaClient);
+      legacyStaClient->SetStartTime (MicroSeconds (400000));
+      legacyStaClient->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));
+    }
+
+  // Trace dropped packets
+  Config::Connect ("/NodeList/*/DeviceList/*/$ns3::WifiNetDevice/Phy/PhyRxDrop",
+                   MakeCallback (&TestUnsupportedModulationReception::Dropped, this));
+
+  Simulator::Stop (Seconds (1));
+  Simulator::Run ();
+
+  CheckResults ();
+
+  Simulator::Destroy ();
+}
+
+void
+TestUnsupportedModulationReception::CheckResults (void)
+{
+  NS_TEST_EXPECT_MSG_EQ (m_dropped, 0, "Dropped some packets unexpectedly");
+}
+
+/**
+ * \ingroup wifi-test
+ * \ingroup tests
+ *
  * \brief wifi PHY reception Test Suite
  */
 class WifiPhyReceptionTestSuite : public TestSuite
@@ -2361,6 +2570,7 @@
   AddTestCase (new TestSimpleFrameCaptureModel, TestCase::QUICK);
   AddTestCase (new TestPhyHeadersReception, TestCase::QUICK);
   AddTestCase (new TestAmpduReception, TestCase::QUICK);
+  AddTestCase (new TestUnsupportedModulationReception (), TestCase::QUICK);
 }
 
 static WifiPhyReceptionTestSuite wifiPhyReceptionTestSuite; ///< the test suite
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wifi/wscript ns-3.35/src/wifi/wscript
--- ns-3.34/src/wifi/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wifi/wscript	2021-10-01 13:26:48.000000000 -0700
@@ -17,6 +17,7 @@
         'model/non-ht/dsss-error-rate-model.cc',
         'model/table-based-error-rate-model.cc',
         'model/interference-helper.cc',
+        'model/wifi-phy-common.cc',
         'model/yans-wifi-phy.cc',
         'model/yans-wifi-channel.cc',
         'model/spectrum-wifi-phy.cc',
@@ -98,6 +99,7 @@
         'model/vht/vht-operation.cc',
         'model/non-ht/dsss-parameter-set.cc',
         'model/edca-parameter-set.cc',
+        'model/he/mu-edca-parameter-set.cc',
         'model/he/he-capabilities.cc',
         'model/frame-capture-model.cc',
         'model/simple-frame-capture-model.cc',
@@ -261,6 +263,7 @@
         'model/vht/vht-operation.h',
         'model/non-ht/dsss-parameter-set.h',
         'model/edca-parameter-set.h',
+        'model/he/mu-edca-parameter-set.h',
         'model/he/he-capabilities.h',
         'model/frame-capture-model.h',
         'model/simple-frame-capture-model.h',
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wimax/bindings/modulegen__gcc_ILP32.py ns-3.35/src/wimax/bindings/modulegen__gcc_ILP32.py
--- ns-3.34/src/wimax/bindings/modulegen__gcc_ILP32.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wimax/bindings/modulegen__gcc_ILP32.py	2021-10-01 13:26:48.000000000 -0700
@@ -2188,11 +2188,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2297,11 +2292,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2418,11 +2408,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2615,11 +2600,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wimax/bindings/modulegen__gcc_LP64.py ns-3.35/src/wimax/bindings/modulegen__gcc_LP64.py
--- ns-3.34/src/wimax/bindings/modulegen__gcc_LP64.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wimax/bindings/modulegen__gcc_LP64.py	2021-10-01 13:26:48.000000000 -0700
@@ -2188,11 +2188,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsEqual(ns3::Ipv4Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv4-address.h (module 'network'): bool ns3::Ipv4Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2297,11 +2292,6 @@
                    'ns3::Ipv4Mask', 
                    [], 
                    is_static=True)
-    ## ipv4-address.h (module 'network'): bool ns3::Ipv4Mask::IsEqual(ns3::Ipv4Mask other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv4Mask', 'other')], 
-                   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', 
@@ -2418,11 +2408,6 @@
                    'bool', 
                    [], 
                    is_const=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsEqual(ns3::Ipv6Address const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Address const &', 'other')], 
-                   deprecated=True, is_const=True)
     ## ipv6-address.h (module 'network'): bool ns3::Ipv6Address::IsInitialized() const [member function]
     cls.add_method('IsInitialized', 
                    'bool', 
@@ -2615,11 +2600,6 @@
                    'ns3::Ipv6Prefix', 
                    [], 
                    is_static=True)
-    ## ipv6-address.h (module 'network'): bool ns3::Ipv6Prefix::IsEqual(ns3::Ipv6Prefix const & other) const [member function]
-    cls.add_method('IsEqual', 
-                   'bool', 
-                   [param('ns3::Ipv6Prefix const &', 'other')], 
-                   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', 
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wimax/model/service-flow.cc ns-3.35/src/wimax/model/service-flow.cc
--- ns-3.34/src/wimax/model/service-flow.cc	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wimax/model/service-flow.cc	2021-10-01 13:26:48.000000000 -0700
@@ -156,7 +156,7 @@
           }
         case SfVectorTlvValue::Fixed_length_versus_Variable_length_SDU_Indicator:
           {
-            m_fixedversusVariableSduIndicator = ((U16TlvValue*)((*iter)->PeekValue ()))->GetValue ();
+            m_fixedversusVariableSduIndicator = ((U8TlvValue*)((*iter)->PeekValue ()))->GetValue ();
             break;
           }
         case SfVectorTlvValue::CS_Specification:
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/src/wscript ns-3.35/src/wscript
--- ns-3.34/src/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/src/wscript	2021-10-01 13:26:48.000000000 -0700
@@ -1,4 +1,3 @@
-
 ## -*- Mode: python; py-indent-offset: 4; indent-tabs-mode: nil; coding: utf-8; -*-
 from __future__ import print_function
 import os, os.path
@@ -125,7 +124,7 @@
     module.ns3_dir_location = bld.path.path_from(bld.srcnode)
 
     module.env.append_value("INCLUDES", Context.out_dir)
-    
+
     module.pcfilegen = bld(features='ns3pcfile')
     module.pcfilegen.module = module.name
 
@@ -277,17 +276,15 @@
             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_35=', '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
         except ValueError:
             pass
     pymod.env['DEFINES'] = defines
-    # The following string should lead to includes of 
+    # The following string should lead to includes of
     # '-I.', '-Isrc/core/bindings' when compiling module_helpers.cc
     pymod.includes = Context.out_dir + ' ' + Context.out_dir + '/src/core/bindings'
     pymod.install_path = '${PYTHONARCHDIR}/ns'
@@ -442,7 +439,10 @@
     if self.module is None:
         raise WafError("'module' missing on ns3headers object %s" % self)
     ns3_dir_node = self.bld.path.find_or_declare("ns3")
-    for filename in set(self.to_list(self.source)):
+    headers_to_process = set(self.to_list(self.source))
+    if hasattr(self, 'deprecated'):
+        headers_to_process.update(set(self.to_list(self.deprecated)))
+    for filename in headers_to_process:
         src_node = self.path.find_resource(filename)
         if src_node is None:
             raise WafError("source ns3 header file %s not found" % (filename,))
@@ -458,6 +458,9 @@
             task.header_to_remove = dst_node
     self.headers = set(self.to_list(self.source))
     self.source = '' # tell WAF not to process these files further
+    if hasattr(self, 'deprecated'):
+        self.deprecated = '' # tell WAF not to process these files further
+
 
 
 class ns3header(Task.Task):
@@ -620,7 +623,6 @@
                     raise
             return 0
 
-
 class gen_ns3_module_header(Task.Task):
     before = ['cxxprogram', 'cxxshlib', 'cxxstlib']
     after = 'ns3header'
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/utils/check-style.py ns-3.35/utils/check-style.py
--- ns-3.34/utils/check-style.py	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/utils/check-style.py	2021-10-01 13:26:48.000000000 -0700
@@ -15,7 +15,7 @@
     process = subprocess.Popen(["git","rev-parse","--show-toplevel"],
                                stdout = subprocess.PIPE,
                                stderr = subprocess.PIPE)
-    (root_dir, error) = process.communicate()
+    root_dir, _ = process.communicate()
     if isinstance(root_dir, bytes):
         root_dir=root_dir.decode("utf-8")
     files_changed = [item.strip() for item in files.readlines()]
@@ -23,7 +23,7 @@
     return [root_dir[: -1] + "/" + filename.strip () for filename in files_changed]
 
 def copy_file(filename):
-    [tmp,pathname] = tempfile.mkstemp()
+    _, pathname = tempfile.mkstemp()
     with open(filename, 'r') as src, open(pathname, 'w') as dst:
         for line in src:
             dst.write(line)
@@ -132,7 +132,7 @@
 disable_processing_cmt= " *NS_CHECK_STYLE_OFF*"
 enable_processing_cmt=  " *NS_CHECK_STYLE_ON*"
 """
-    [tmp,pathname] = tempfile.mkstemp()
+    _, pathname = tempfile.mkstemp()
     with open(pathname, 'w') as dst:
         dst.write(level0)
         if level >= 1:
@@ -537,9 +537,8 @@
                       help="Generate a diff on stdout of the indented files")
     parser.add_option('-i', '--in-place', action='store_true', dest='in_place', default=False,
                       help="Indent the input files in-place")
-    (options,args) = parser.parse_args()
-    debug = options.debug
-    style_is_correct = False;
+    options, _ = parser.parse_args()
+    style_is_correct = False
 
     if options.git:
         files = git_modified_files()
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/VERSION ns-3.35/VERSION
--- ns-3.34/VERSION	2021-07-14 10:32:18.000000000 -0700
+++ ns-3.35/VERSION	2021-10-01 13:27:51.000000000 -0700
@@ -1 +1 @@
-3.34
+3.35
diff -Naur -x '*.dia' -x '*.pcap' -x '*.png' ns-3.34/wscript ns-3.35/wscript
--- ns-3.34/wscript	2021-07-14 10:31:07.000000000 -0700
+++ ns-3.35/wscript	2021-10-01 13:26:48.000000000 -0700
@@ -32,8 +32,8 @@
 examples_enabled = False
 tests_enabled    = False
 
-# GCC minimum version requirements for C++11 support
-gcc_min_version = (4, 9, 2)
+# GCC minimum version requirements for C++17 support
+gcc_min_version = (7, 0, 0)
 
 # Bug 2181:  clang warnings about unused local typedefs and potentially
 # evaluated expressions affecting darwin clang/LLVM version 7.0.0 (Xcode 7)
@@ -735,7 +735,7 @@
         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"
+        cxx_standard = "-std=c++17"
         env.append_value('CXXFLAGS', cxx_standard)
 
     if not conf.check_compilation_flag(cxx_standard):
